একটি প্রাথমিক কী কখন ক্লাস্টারবিহীন হিসাবে ঘোষণা করা উচিত?


169

আমি আগে জিজ্ঞাসা করা অন্য প্রশ্নের জন্য একটি পরীক্ষামূলক ডাটাবেস তৈরি করার সময়, আমি একটি প্রাথমিক কী ঘোষিত হতে সক্ষম হওয়া সম্পর্কে মনে করেছি NONCLUSTERED

আপনি কখন একটি NONCLUSTEREDপ্রাথমিক কীটির বিপরীতে একটি CLUSTEREDপ্রাথমিক কী ব্যবহার করবেন?

আগাম ধন্যবাদ

উত্তর:


187

প্রশ্নটি 'পিকে কখন এনসি হওয়া উচিত' তা নয়, এর পরিবর্তে আপনার জিজ্ঞাসা করা উচিত 'ক্লাস্টারড ইনডেক্সের উপযুক্ত কী কী'?

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

ধাঁধাটির আরও একটি অংশ হ'ল কীভাবে একটি সূচক ব্যবহার করা যেতে পারে ? তিনটি আদর্শ নিদর্শন রয়েছে:

  • প্রোব, যখন একটি একক কী মান সূচীতে সন্ধান-এড হয়
  • সীমার স্ক্যানগুলি যখন মূল মানগুলির একটি ব্যাপ্তি পুনরুদ্ধার করা হয়
  • প্রয়োজন অনুসারে অর্ডার করুন, যখন কোনও সূচক ডাব্লু / ও দ্বারা একটি স্টপ-অ্যান্ড-গো বাছাইয়ের প্রয়োজনের মাধ্যমে কোনও অর্ডার সন্তুষ্ট করতে পারে

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

তবুও আরেকটি বিষয় হ'ল ক্লাস্টারড ইনডেক্স কী হ'ল লকিং কী সমস্ত নন-ক্লাস্টারযুক্ত সূচকগুলি ব্যবহার করে এবং অতএব প্রশস্ত ক্লাস্টার ইনডেক্স কীটি একটি রিপল প্রভাব তৈরি করে এবং সমস্ত নন-ক্লাস্টারযুক্ত সূচককে প্রশস্ত করে দেয় এবং আরও বিস্তৃত সূচকগুলি আরও পৃষ্ঠাগুলি বোঝায়, আরও I / O , আরও স্মৃতি, কম মঙ্গল।

একটি ভাল ক্লাস্টারড সূচক স্থিতিশীল , সত্তার জীবদ্দশায় এটি পরিবর্তন হয় না, কারণ ক্লাস্টারড ইনডেক্স কী মানগুলির পরিবর্তনের অর্থ সারিটি মুছে ফেলা এবং ফিরে sertedোকাতে হবে।

পৃষ্ঠা বিভাজন এবং টুকরো টুকরো টুকরো টুকরো টুকরো করতে (এগুলির সাথে গোলমাল না করে) এলোমেলোভাবে নয় (প্রতিটি নতুন সন্নিবেশকৃত মানটি পূর্বের মানের চেয়ে বড়) একটি ভাল ক্লাস্টারড সূচক বৃদ্ধি পায় FILLFACTOR

সুতরাং এখন যেহেতু আমরা জানি একটি ভাল ক্লাস্টারড ইনডেক্স কীটি কী, প্রাথমিক কী (যা একটি ডেটা মডেলিং লজিকাল প্রপার্টি) প্রয়োজনীয়তার সাথে মিলে যায়? যদি হ্যাঁ, তবে পিকে ক্লাস্টার করা উচিত। যদি না হয়, তবে পিকে নন-ক্লাস্টার হওয়া উচিত।

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

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


1
"প্রয়োজনীয়তা অনুসারে অর্ডার করা, যখন কোনও সূচক ডাব্লু / ও দ্বারা স্টপ-অ্যান্ড-গো সাজানোর প্রয়োজনীয়তার সাথে অর্ডার সন্তুষ্ট করতে পারে" এর অর্থ এখানে কী?
মাইক শেরিল 'ক্যাট রিক্যাল'

2
@RemusRusanu। +1 খুব দরকারী উত্তর। উদাহরণ সম্পর্কিত একটি প্রশ্ন (state, id)। এই উদাহরণে "ভাল ক্লাস্টারড সূচকটি এলোমেলোভাবে ক্রমে বৃদ্ধি পায়" প্রয়োজনীয়তা পূরণ হবে না, তাই না? তাহলে আমরা কি এটিকে ভাল ক্লাস্টারড সূচক হিসাবে বিবেচনা করতে পারি?
Lijo

26

ক্লাস্টারড ইনডেক্স ব্যবহারের মূল কারণটি উইকিপিডিয়ায় বর্ণিত হয়েছে :

ক্লাস্টারিং ডেটা ব্লককে সূচকের সাথে মেলে একটি নির্দিষ্ট স্বতন্ত্র ক্রমে পরিবর্তিত করে, ফলস্বরূপ সারি তথ্য ক্রমে সংরক্ষণ করা হয়। সুতরাং, প্রদত্ত ডাটাবেস টেবিলটিতে কেবল একটি ক্লাস্টার ইনডেক্স তৈরি করা যায়। ক্লাস্টারযুক্ত সূচকগুলি সামগ্রিকভাবে পুনরুদ্ধারের গতি বাড়িয়ে তুলতে পারে , তবে সাধারণত কেবল যেখানে ক্লাস্টার ইনডেক্সের একই বা বিপরীত ক্রমে ডেটা ক্রমিকভাবে অ্যাক্সেস করা হয় বা যখন আইটেমগুলির একটি ব্যাপ্তি নির্বাচন করা হয়।

বলুন যে আমার কাছে জনগণের একটি টেবিল রয়েছে এবং এই ব্যক্তিদের একটি দেশের কলাম এবং একটি অনন্য প্রাথমিক কী রয়েছে। এটি একটি ডেমোগ্রাফিক্স টেবিল, সুতরাং এগুলি কেবল আমার যত্ন নেওয়া; কী দেশ এবং কত অনন্য মানুষ সেই দেশের সাথে আবদ্ধ।

আমি কেবল যেখানেই কলাম বা দেশ কলামের মাধ্যমে অর্ডার করতে পছন্দ করি; প্রাইমারি কীতে একটি ক্লাস্টারড ইনডেক্স আমার কোনও ভাল কাজ করে না, আমি পিকে দ্বারা এই ডেটা অ্যাক্সেস করছি না, আমি এই অন্য কলামটি দ্বারা এটি অ্যাক্সেস করছি। যেহেতু আমি কেবল একটি টেবিলে একটি ক্লাস্টার ইনডেক্স রাখতে পারি, তাই আমার পিকে ক্লাস্টারড হিসাবে ঘোষণা করা আমাকে দেশে ক্লাস্টারড ইনডেক্স ব্যবহার থেকে বিরত রাখতে পারে।

অধিকন্তু, এখানে ক্লাস্টার্ড বনাম ননক্লাস্টারড ইনডেক্সগুলির একটি ভাল নিবন্ধ রয়েছে, এসকিউএল সার্ভার 6.5 (যা অন্তত আমাদের বেশিরভাগ ক্ষেত্রেই প্রাসঙ্গিক নয়) এর মধ্যে ক্লাস্টারড ইনডেক্সগুলি সন্নিবেশিত পারফরম্যান্স সংক্রান্ত সমস্যার সূচনা করে

আপনি যদি একটি পরিচয় কলামে একটি ক্লাস্টার্ড সূচক রাখেন, তবে আপনার সমস্ত সন্নিবেশ সারণির শেষ পৃষ্ঠায় ঘটবে - এবং সেই পৃষ্ঠাটি প্রতিটি পরিচয়ের সময়কালের জন্য লক করা আছে। কোনও বড় কথা নয় ... যদি না আপনার 5000 জন লোক থাকে যা সকলেই শেষ পৃষ্ঠাটি চায় want তারপরে আপনার এই পৃষ্ঠাটির জন্য অনেক বিতর্ক রয়েছে

নোট করুন যে পরবর্তী সংস্করণগুলিতে এটি হয় না।


3
এফআইওয়াই, আপনি এসকিউএল সার্ভার 6.৫ উল্লেখ করেছেন: dba.stackexchange.com/questions/1584/…
gbn

15

যদি আপনার প্রাথমিক কীটি এর হয় তবে UNIQUEIDENTIFIERতা নিশ্চিত করে নিন NONCLUSTERED। আপনি যদি এটি ক্লাস্টারযুক্ত করেন তবে প্রতিটি সন্নিবেশকে সঠিক অবস্থানে নতুন সারিটি সন্নিবেশ করানোর জন্য রেকর্ডগুলির একগুচ্ছ শিফ্লিং করতে হবে। এই কর্মক্ষমতা ট্যাঙ্ক হবে।


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

7

একটি খুব সাধারণ উদাহরণ:

  • CustomerCustomerIDহিসাবে টেবিলCLUSTERED PRIMARY KEY
  • অর্ডার টেবিল OrderID (PK), CustomerID, OrderDateএবং অন্যান্য কিছু কলাম সহ
  • OrderPositions সঙ্গে OrderPositionID (PK), OrderId, ProductID, Amount, Price ...
  • আপনি আদেশ সারণী সূচী করতে হবে

অবশ্যই "এটি নির্ভর করে" হ'ল - প্রায় সর্বদা - সঠিক উত্তর, তবে সর্বাধিক অ্যাপ্লিকেশনগুলি (দ্বি-প্রতিবেদন নয়) গ্রাহক ভিত্তিক কাজ করবে (যেমন আপনি ওয়েবসাইটে 278 গ্রাহক হিসাবে লগ ইন করেছেন এবং "আমার আদেশগুলি" বা ক্লিক করুন) কেরানি 45669 গ্রাহকের জন্য সমস্ত অর্ডার তালিকাভুক্ত করে বা আপনার চালানের রুটিন গ্রাহকের জন্য সমস্ত ক্রম 137 সরবরাহ করবে)।

এই ক্ষেত্রে এটি দ্বারা টেবিল ক্লাস্টার করা খুব একটা বোধগম্য হবে না OrderID। হ্যাঁ, SELECT ... WHERE OrderId = ?অর্ডার বিশদটি তালিকাবদ্ধ করতে আপনার কাছে প্রশ্ন থাকবে তবে এটি সাধারণত সংক্ষিপ্ত এবং সস্তার (3 টি পড়া) সূচক চাইবে।

অন্যদিকে, আপনি যদি নিজের Orderটেবিলটি দ্বারা ক্লাস্টার CustomerIDকরেন তবে প্রতিবার আপনি টেবিলটি অনুসন্ধান করার জন্য একাধিক কী লুকআপ করতে হবে না CustomerId = ?

CLUSTERED INDEXসবসময় হওয়া উচিত UNIQUE, অন্যথায় SQL সার্ভার অদৃশ্য (= অব্যবহারযোগ্য) INT কলাম যোগ করবে UNIQUIFIERuniquiness নিশ্চিত করার - এবং তারপর কিছু র্যান্ডম (ঢোকাতে অর্ডার উপর নির্ভর করে) কাপড় বাস্তব (ব্যবহারযোগ্য) ডেটা যোগ করার জন্য আরো অনেক কিছু জানার জন্য হবে।

যেহেতু কোনও গ্রাহক একাধিক অর্ডার দেবেন (আশা করি) আমাদের একটি OrderIDবা (আপনি সাধারণত এর জন্য বাছাই OrderDateকরলে ) যোগ করতে হবে (যদি এটি একটি তারিখের সময় হয় - অন্যথায় গ্রাহক প্রতি দিন একটি আদেশে সীমাবদ্ধ থাকবে) CLUSTERED INDEXএবং তার উপরের শেষ:

CREATE UNIQUE CLUSTERED INDEX IX_Orders_UQ on Orders (CustomerID, OrderID)

একই বিধিগুলি OrderPositionsটেবিলে প্রযোজ্য । সাধারণত সবচেয়ে প্রশ্নের নির্দিষ্ট অনুক্রম জন্য সব অবস্থানের তালিকা হবে, তাই আপনার সাথে পি কে তৈরি করা উচিত OrderPositionIDহিসাবে NONCLUSTEREDএবং একটি UNIQUE CLUSTERED INDEXউপর OrderId, OrderPositionID

বিটিডাব্লু: এটি সঠিক যে Customerটেবিলটি তার পিকে দ্বারা ক্লাস্টার করা হয়েছে (এটি CustomerID, কারণ এটি একটি "শীর্ষ-স্তর-সারণী" এবং একটি সাধারণ প্রয়োগে - বেশিরভাগই এটির গ্রাহকআইডি দ্বারা অনুসন্ধান করা হবে।

যেমন যেমন বিশুদ্ধ লুকআপ টেবিল Gendersবা InvoiceTypesবা PaymentTypeটেবিল যে তার পি কে দ্বারা ক্লাস্টার করা উচিত (কারণ আপনি সাধারণত তাদের উপর যোগাদান করবেন আরেকটি উদাহরণ GenderId, InvoiceTypeIdবা PaymentTypeId)।


2

যখন কোনও ক্লাস্টারড ইনডেক্সকে কিছু পরিমান পারফরম্যান্স ব্যবহার করে একটি ক্লাস্টারড পিকে থেকে সামগ্রিক সিস্টেমের জন্য বেশি উপকারী বলে মনে করা হয়। কোনও টেবিলে কেবল একটি ক্লাস্টার্ড সূচক থাকতে পারে।

পারফরম্যান্সের উদাহরণগুলি হ'ল একক ক্যোয়ারির সময় (গতি), টেবিলের বিপরীতে মোট ক্যোয়ারী সময়ের একীকরণ (দক্ষতা) এবং ক্লাস্টার (আকারের মতো) ক্রিয়াকলাপ অর্জনের জন্য অনেকগুলি একটি বৃহত নন-ক্লাস্টারড ইনডেক্সে কলামগুলি অন্তর্ভুক্ত করে many )।

এটি তখন ঘটতে পারে যখন অনুলিখিত কোনও সূচক ব্যবহার করে ডেটা পুনরুদ্ধার করা হয় যা নাল থাকে (কোনও পিকে অনুমোদিত নয়), বা পিকে কোনও দ্বিতীয় কারণে যুক্ত করা হয় (যেমন প্রতিলিপি বা নিরীক্ষণের ট্রেইল রেকর্ড সনাক্তকরণ)।

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