ক্লাস্টার্ড বনাম নন-ক্লাস্টারড


98

এসকিউএল (সার্ভার ২০০৮) সম্পর্কে আমার নিম্ন স্তরের জ্ঞান সীমাবদ্ধ, এবং এখন আমাদের ডিবিএ দ্বারা চ্যালেঞ্জ করা হচ্ছে। আমাকে ব্যাখ্যা করতে দিন (আমি ঠিক আছে এই আশায় সুস্পষ্ট বক্তব্য উল্লেখ করেছি, তবে আপনি যদি কিছু ভুল দেখেন তবে দয়া করে আমাকে বলুন) দৃশ্যটি:

আমাদের কাছে একটি টেবিল রয়েছে যা মানুষের জন্য 'কোর্ট অর্ডার' ধারণ করে। আমি যখন টেবিলটি তৈরি করেছি, (নাম: কোর্টআর্ডার), তখন আমি এটি তৈরি করেছিলাম:

CREATE TABLE dbo.CourtOrder
(
  CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
  PersonId INT NOT NULL,
  + around 20 other fields of different types.
)

আমি তখন প্রাথমিক কীতে (দক্ষতার জন্য) একটি ক্লাস্টারবিহীন সূচক প্রয়োগ করেছি। আমার কারণগুলি হ'ল এটি একটি অনন্য ক্ষেত্র (প্রাথমিক কী), এবং মূলত বাছাইয়ের উদ্দেশ্যে, যেমন আমাদের প্রায়শই হয় তাই সূচিযুক্ত করা উচিতSelect from table where primary key = ...

আমি তারপরে পার্সোনআইডিতে একটি ক্লাস্টারড সূচক প্রয়োগ করেছি। শারীরিকভাবে কোনও নির্দিষ্ট ব্যক্তির জন্য গ্রুপের অর্ডার দেওয়ার কারণ ছিল, কারণ বেশিরভাগ কাজ কোনও ব্যক্তির অর্ডার পাচ্ছে। সুতরাং,select from mytable where personId = ...

আমি এই এখন টানা হয়েছে। আমাকে বলা হয়েছে যে আমাদের ক্লাস্টারড ইনডেক্সটি প্রাথমিক কীতে এবং ব্যক্তি সূচকটিতে সাধারণ সূচি রাখা উচিত। এটা আমার কাছে খুব আজব লাগে। প্রথমে, আপনি কেন একটি অনন্য কলামে একটি ক্লাস্টার্ড সূচি রাখবেন? এটা কি গুচ্ছ? নিশ্চয়ই এটি ক্লাস্টারড ইনডেক্সের অপচয়? আমি বিশ্বাস করতাম একটি অনন্য কলামে একটি সাধারণ সূচক ব্যবহৃত হবে। এছাড়াও, সূচকটি ক্লাস্টিংয়ের অর্থ হ'ল আমরা একটি আলাদা কলাম ক্লাস্টার করতে পারি না (এক টেবিলের প্রতি এক, ডান?)

আমার যে ভুল হওয়ার কথা বলা হচ্ছে তার যুক্তি হ'ল তারা বিশ্বাস করে যে পার্সোনআইডিতে একটি ক্লাস্টার ইনডেক্স লাগানো সন্নিবেশকে ধীর করে দেবে। একটি নির্বাচনের গতিতে 5% লাভের জন্য, আমরা সন্নিবেশ এবং আপডেটগুলিতে গতিতে 95% অবনতি পাচ্ছি। এটি কি সঠিক এবং বৈধ?

তারা বলে যে আমরা ব্যক্তি আইডি ক্লাস্টার করেছি, এসকিউএল সার্ভারকে যখনই sertোকানো হয় বা পার্সোনআইডে পরিবর্তন করা হয় তখন ডেটা পুনরায় সাজানো হয়।

সুতরাং আমি জিজ্ঞাসা করেছি, এসকিউএল এর ক্লাস্টারড ইন্ডেক্সের ধারণাটি কেন এত ধীর? তারা কি বলছে ততই ধীর? সর্বোত্তম পারফরম্যান্স অর্জনের জন্য আমার কীভাবে আমার সূচকগুলি সেটআপ করা উচিত? আমি ভাবতাম নির্বাচনটি INSERT এর চেয়ে বেশি ব্যবহৃত হয় ... তবে তারা বলে যে আমরা INSERTS এ সমস্যাটি লক করছি ...

আশা করি কেউ আমাকে সাহায্য করতে পারে।


উত্তর:


117

একটি ক্লাস্টার বনাম বনাম নন-ক্লাস্টারড ইনডেক্সের মধ্যে পার্থক্য হ'ল ক্লাস্টারড সূচক ডাটাবেজে সারিগুলির শারীরিক ক্রম নির্ধারণ করে । অন্য কথায়, ক্লাস্টারড ইনডেক্স প্রয়োগ করার PersonIdঅর্থ PersonIdসারণি দ্বারা সারিগুলি শারীরিকভাবে বাছাই করা হবে , এটির উপর ভিত্তি করে একটি সূচী অনুসন্ধানটি সরাসরি সারিতে চলে যাবে (একটি ক্লাস্টারবিহীন সূচকের পরিবর্তে, যা আপনাকে সারিটির দিকে নির্দেশ করবে) অবস্থান, একটি অতিরিক্ত পদক্ষেপ যুক্ত)।

এটি বলেছিল, প্রাথমিক কীটি ক্লাস্টারড ইনডেক্স না হওয়া অস্বাভাবিক , তবে শোনা যায়নি। আপনার দৃশ্যের সমস্যাটি আসলে আপনি যা অনুমান করছেন তার বিপরীত: আপনি ক্লাস্টার ইনডেক্সে অনন্য মান চান , নকল নয়। কারণ ক্লাস্টার্ড সূচকটি সারিটির দৈহিক ক্রম নির্ধারণ করে, যদি সূচকটি কোনও অনন্য-কলামে থাকে, তবে সার্ভারটি সারিগুলিতে একটি পটভূমি মান যুক্ত করতে হবে যার ডুপ্লিকেট কী মান রয়েছে (আপনার ক্ষেত্রে, একই সাথে কোনও সারি রয়েছে) PersonId) যাতে সম্মিলিত মান (কী + পটভূমি মান) অনন্য।

একমাত্র জিনিস আমি আপনাকে পরামর্শ দিচ্ছি হয় হবে না একটি ভাড়াটে কী (আপনার ব্যবহার CourtOrderId) প্রাথমিক কী হিসাবে কলাম, কিন্তু এর পরিবর্তে একটি যৌগ প্রাথমিক কী ব্যবহার PersonIdএবং কিছু অন্যান্য স্বতন্ত্র-চিহ্নিত কলাম বা কলামের সেট। যদি তা সম্ভব না হয় (বা ব্যবহারিক না হয়) তবে ক্লাস্টারড ইনডেক্সটি রাখুন CourtOrderId


ধন্যবাদ আদম। সুতরাং, কখন একটি ক্লাস্টার্ড সূচক কার্যকর হবে? আমি ভেবেছিলাম সুবিধাটি ক্লাস্টারড ইনডেক্সটি হ'ল ডেটা গ্রুপ করা, যখন বেশিরভাগ সময়, উদাহরণস্বরূপ, বেশিরভাগ প্রশ্নগুলি একটি পার্সোনআইডিতে থাকে ... সুতরাং ডেটাগুলি গ্রুপ করা হবে।
ক্রেগ

4
এটা তোলে হয় না শারীরিকভাবে অনুসারে সাজানো PersonId। এটি যৌক্তিকভাবে অনুসারে বাছাই করা হয়েছে PersonId, যৌক্তিক এবং শারীরিক ক্রমের মধ্যে কোনও তাত্পর্য হ'ল লজিকাল খণ্ডনের ডিগ্রি।
মার্টিন স্মিথ

4
@cdotlister একটি সূচির সুবিধা হ'ল ডেটা বাছাই করা , এটির গোষ্ঠীভুক্ত নয় (যা সূচকে ডুপ্লিকেটযুক্ত ডেটা বোঝায় )। পার্থক্যটি শব্দার্থক বলে মনে হলেও ক্লাস্টার ইনডেক্সের ক্ষেত্রে এটি হয় না। যদি সম্ভব হয় তবে ক্লাস্টারড ইনডেক্স এমন কিছুতে থাকা উচিত যা সারিটি অনন্যভাবে চিহ্নিত করে এবং (আদর্শভাবে) সর্বাধিক জিজ্ঞাসিত কলাম বা কলামগুলির সেট। এজন্য এটি সাধারণত প্রাথমিক কীতে থাকে।
অ্যাডাম রবিনসন

4
@ সাইবারস্লুথ ওমেগা: আমি জানি না; আপনার প্রশ্নে আমার সিদ্ধান্ত নেওয়ার জন্য পর্যাপ্ত তথ্য নেই। আমি কি কলামগুলির সেটগুলিতে একটি ক্লাস্টারড ইনডেক্স চাইব যেখানে সারণির শেষে ছাড়া সারিগুলি প্রায়শই যুক্ত বা মুছে ফেলা হবে ? না, তবে আমি কেন নিশ্চিত তা জানি না যে আপনি এটি কেন জিজ্ঞাসা করছেন বা ডাউনটা কেন।
অ্যাডাম রবিনসন

4
টুইটার আপনি দাবি করেছেন যে আমি বলেছিলাম যে ক্লাস্টার ইনডেক্সটি প্রাথমিক কী বাদে অন্য কিছু তৈরি করার কোনও পরিস্থিতি আমার জানা ছিল না, যখন বাস্তবে আমি এ জাতীয় কিছুই বলিনি। আসলে কিসের আমি বললাম ছিল "এই হল অস্বাভাবিক ..., কিন্তু শোনা যায় না", যার মানে আমি কি যেখানে এই কাজ করা হয় মামলার জানি।
অ্যাডাম রবিনসন

14

আমি কোনও উপায়েই এসকিউএল বিশেষজ্ঞ নই ... সুতরাং এটি ডিবিএ দেখার চেয়ে বিকাশকারীর দৃষ্টিভঙ্গি হিসাবে নিন ..

ক্লাস্টারযুক্ত (শারীরিকভাবে অর্ডার করা) সূচকগুলিতে সন্নিবেশগুলি যেগুলি ক্রমিক ক্রমে নেই সন্নিবেশ / আপডেটের জন্য অতিরিক্ত কাজ করে। এছাড়াও, আপনার যদি একবারে অনেকগুলি সন্নিবেশ ঘটতে থাকে এবং সেগুলি একই স্থানে ঘটে থাকে তবে আপনি বিতর্ক শেষ করবেন। আপনার নির্দিষ্ট পারফরম্যান্স আপনার ডেটা এবং আপনি কীভাবে এটি অ্যাক্সেস করবেন তার উপর ভিত্তি করে পরিবর্তিত হয়। থাম্বের সাধারণ নিয়মটি হ'ল আপনার টেবিলের সর্বাধিক অনন্য সংকীর্ণ মানের (সাধারণত পিকে) আপনার ক্লাস্টারড সূচক তৈরি করা to

আমি ধরে নিচ্ছি আপনার পার্সোনআইডি পরিবর্তন হবে না, তাই আপডেটগুলি এখানে কার্যকর হয় না। তবে 1 2 3 3 4 5 6 7 8 8 এর ব্যক্তি আইড সহ কয়েকটি সারিগুলির একটি স্ন্যাপশট বিবেচনা করুন

এখন 3 ব্যক্তির আইডির জন্য 20 টি নতুন সারি sertোকান প্রথমত, যেহেতু এটি কোনও অনন্য কী নয়, তাই সার্ভারটি আপনাকে অনন্য করে তুলতে আপনার দৃশ্যে (পর্দার আড়ালে) কিছু অতিরিক্ত বাইট যুক্ত করে (এটি অতিরিক্ত স্থান যুক্ত করে) এবং তারপরে যেখানে অবস্থানটি এগুলিকে পরিবর্তন করতে হবে। একটি স্বয়ংক্রিয়-বৃদ্ধি পিকে সন্নিবেশ করার সাথে তার তুলনা করুন যেখানে সন্নিবেশগুলি শেষে ঘটে। প্রযুক্তিবিহীন ব্যাখ্যা সম্ভবত এটিতে নেমে আসবে: যদি আপনার আইটেমগুলি সন্নিবেশ করানোর সময় সারণীতে শেষের দিকে বিদ্যমান আইটেমগুলির পুনরায় কাজ করা বনাম টেবিলের শেষে স্বাভাবিকভাবে উন্নত হয় তবে কাজ করতে কম 'লিফ-শিফলিং' কাজ করতে হবে।

এখন, যদি আপনার সন্নিবেশ নিয়ে সমস্যা হয় তবে আপনি সম্ভবত একই (বা অনুরূপ) পার্সোনআইড মানগুলির একটি গুচ্ছটি একবারে tingোকাচ্ছেন যা পুরো টেবিলে বিভিন্ন স্থানে এই অতিরিক্ত কাজকে সজ্জিত করছে এবং খণ্ডটি আপনাকে মেরে ফেলছে। আপনার ক্ষেত্রে পিকে স্যুইচ করার নেতিবাচক দিকটি হ'ল যদি আপনি আজ ব্যক্তিগত নীতিগুলিতে ইস্যুগুলি সন্নিবেশ করিয়ে থাকেন যা পুরো টেবিলের মধ্যে মূল্য ছড়িয়ে দেওয়া থাকে, আপনি যদি নিজের ক্লাস্টারড সূচকটিকে পিকে স্যুইচ করেন এবং সমস্ত সন্নিবেশ এখন এক হয়ে যায় অবস্থানটি তখন আপনার সমস্যাটি আরও বাড়তে পারে বিরোধের ঘনত্বের কারণে। (ফ্লিপ সাইডে, যদি আজ আপনার সন্নিবেশগুলি পুরোপুরি ছড়িয়ে না পড়ে তবে সবগুলি একইভাবে একই জায়গায় ছড়িয়ে পড়ে থাকে তবে আপনার সমস্যা সম্ভবত আপনার ক্লাস্টারড ইনডেক্সটি পার্সোনআইড থেকে আপনার পিকেতে স্যুইচ করার মাধ্যমে সহজ হয়ে যাবে কারণ আপনি কমিয়ে দিবেন ভগ্নাংশ।)

আপনার পারফরম্যান্স সমস্যাগুলি আপনার অনন্য পরিস্থিতিতে বিশ্লেষণ করা উচিত এবং এই ধরণের উত্তরগুলি কেবল সাধারণ নির্দেশিকা হিসাবে নেওয়া উচিত। আপনার সেরা বাজি হ'ল এমন কোনও ডিবিএর উপর নির্ভর করা যা আপনার সমস্যাগুলি যেখানে রয়েছে সেখানে ঠিকঠাক করতে পারে। দেখে মনে হচ্ছে আপনার রিসোর্স কনটেন্ট সম্পর্কিত সমস্যা রয়েছে যা সাধারণ সূচির ঝাঁকুনির বাইরে হতে পারে। এটি অনেক বড় সমস্যার লক্ষণ হতে পারে। (সম্ভবত ডিজাইন সমস্যাগুলি ... অন্যথায় সংস্থান সীমাবদ্ধতা))

যাই হোক, শুভকামনা!


5

কিছু লেখক পরামর্শ দিচ্ছেন যে যদি এমন কোনও বিকল্প রয়েছে যা সীমার প্রশ্নগুলিতে উপকৃত হতে পারে তবে CIকোনও identityকলামটিতে "অপচয়" না করবেন।

এমএসডিএন ক্লাস্টারড ইনডেক্স ডিজাইন গাইডলাইনগুলি থেকে নিম্নলিখিত মানদণ্ড অনুসারে কী নির্বাচন করা উচিত

  1. প্রায়শই ব্যবহৃত প্রশ্নের জন্য ব্যবহার করা যেতে পারে।
  2. স্বতন্ত্রতা একটি উচ্চ ডিগ্রী প্রদান।
  3. ব্যাপ্তি ক্যোয়ারিতে ব্যবহার করা যেতে পারে।

আপনার CourtOrderIDকলামটি পূরণ করে 2। আপনার PersonIdদেখা 1এবং 3। যেহেতু বেশিরভাগ সারি uniqueifierযুক্ত হওয়ার সাথে সাথে শেষ হয়ে যাবে তবে আপনি একে একে অনন্য হিসাবে ঘোষণা করতে পারেন এবং PersonId,CourtOrderIDএটি একই প্রস্থ হিসাবে ব্যবহার করুন তবে ক্লাস্টারড ইনডেক্স কীটি সমস্ত এনসিআইগুলিতে সারি লোকেটার হিসাবে যুক্ত হওয়ার ফলে আরও কার্যকর হবে এবং এটি অনুমতি দেবে তাদের আরও প্রশ্ন কভার।

PersonId,CourtOrderIDসিআই হিসাবে ব্যবহারের মূল সমস্যাটি হ'ল লজিকাল টুকরো টুকরো টুকরো টুকরো হওয়ার সম্ভাবনা দেখা দেয় (এবং এটি আপনাকে বিশেষভাবে সাহায্য করার চেষ্টা করছে এমন রেঞ্জ প্রশ্নগুলিকে প্রভাবিত করে) তাই আপনাকে ফিল ফ্যাক্টর এবং খণ্ড স্তরগুলি নিরীক্ষণ করতে হবে এবং আরও প্রায়ই সূচক রক্ষণাবেক্ষণ সম্পাদন করতে হবে।


3

এটি নিম্নলিখিত লিঙ্কে ব্যাখ্যা করা হয়েছে: https://msdn.microsoft.com/en-us/ms190457.aspx

ক্লাস্টারড

  • ক্লাস্টারড ইনডেক্সগুলি টেবিলে ডেটা সারিগুলিকে বাছাই করে সংরক্ষণ করে বা তাদের মূল মানগুলির উপর ভিত্তি করে দেখুন । এগুলি সূচী সংজ্ঞায় অন্তর্ভুক্ত কলামগুলি। টেবিলের জন্য কেবল একটি ক্লাস্টার ইনডেক্স থাকতে পারে, কারণ তথ্য সারিগুলি কেবলমাত্র একটি ক্রমে সাজানো যেতে পারে।

  • যখন সারণীতে ক্লাস্টারযুক্ত সূচক থাকে তখন কেবল কোনও টেবিলে ডেটা সারিগুলি সাজানো ক্রমে সংরক্ষণ করা হয়। যখন কোনও টেবিলের একটি ক্লাস্টার্ড সূচক থাকে, তখন টেবিলটিকে ক্লাস্টার টেবিল বলে। যদি কোনও টেবিলের কোনও ক্লাস্টারযুক্ত সূচক না থাকে, তবে এর ডেটা সারিগুলিকে একটি হিপ বলা একটি আনর্ডারড কাঠামোয় সংরক্ষণ করা হয়।

অবিচ্ছিন্ন

  • নন ক্ল্লাস্টারড ইনডেক্সের ডেটা সারি থেকে আলাদা একটি কাঠামো রয়েছে। একটি ননক্লাস্টারড ইনডেক্স সি ননক্র্লাস্টারড ইনডেক্স কী মানগুলিকে ধরে রাখে এবং প্রতিটি কী মান এন্ট্রিতে মূল সঞ্চিত ডেটা সারিটিতে একটি পয়েন্টার থাকে

  • একটি অনাবিলিকৃত সূচীতে একটি ইনডেক্স সারি থেকে একটি ডাটা সারিতে নির্দেশককে একটি সারি লোকেটার বলা হয়। সারি লোকেটারের কাঠামো ডেটা পৃষ্ঠাগুলি একটি গাদা বা একটি ক্লাস্টার্ড টেবিলের মধ্যে সঞ্চয় করা আছে কিনা তার উপর নির্ভর করে। একটি গাদা জন্য, একটি সারি লোকেটার সারি একটি পয়েন্টার। একটি ক্লাস্টার্ড টেবিলের জন্য, সারি লোকেটারটি ক্লাস্টারড ইনডেক্স কী।

  • আপনি বিদ্যমান সূচি কী সীমা, 900 বাইট এবং 16 কী কলামগুলিকে বাই-পাস করতে ননক্লাস্টারড সূচকের পাতার স্তরে ননকি কলামগুলি যুক্ত করতে পারেন এবং সম্পূর্ণরূপে আচ্ছাদিত, সূচিকৃত, কোয়েরিগুলি সম্পাদন করতে পারেন।


-3

কিছু দুষ্টু সিলেক্ট করে কিছু ডিবি, সঞ্চিত পদ্ধতিতে যোগ দেয় - কেবল আলাদাভাবে সূচক হয়

সূচি - ক্লাস্টার্ড বনাম ননক্র্লাস্টার

  891 rows
  10 sec
  NONCLUSTERED 

  OR

  891 rows
  14 sec
  CLUSTERED
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.