क्लस्टर्ड और नॉन क्लस्टर्ड इंडेक्स का वास्तव में क्या मतलब है?


1116

मेरे पास डीबी के लिए एक सीमित जोखिम है और केवल डीबी का उपयोग एप्लिकेशन प्रोग्रामर के रूप में किया है। मैं बारे में जानना चाहते Clusteredहैं और Non clustered indexes। मैंने गुगली की और मुझे जो मिला वह था:

एक क्लस्टर इंडेक्स एक विशेष प्रकार का इंडेक्स है जो टेबल में रिकॉर्ड किए गए तरीके को भौतिक रूप से संग्रहीत करता है। इसलिए तालिका में केवल एक संकुल सूचकांक हो सकता है। क्लस्टर किए गए अनुक्रमणिका के पत्ती नोड्स में डेटा पृष्ठ होते हैं। एक गैर-अनुक्रमित सूचकांक एक विशेष प्रकार का सूचकांक है जिसमें सूचकांक का तार्किक क्रम डिस्क पर पंक्तियों के भौतिक संग्रहीत क्रम से मेल नहीं खाता है। नॉनक्लेस्टेड इंडेक्स की लीफ नोड में डेटा पेज नहीं होते हैं। इसके बजाय, पत्ती नोड्स में सूचकांक पंक्तियाँ होती हैं।

एसओ में मुझे जो मिला वह एक संकुल और गैर-संकुल सूचकांक के बीच अंतर क्या थे?

क्या कोई इसे सादे अंग्रेजी में समझा सकता है?

जवाबों:


1115

एक गुच्छेदार सूचकांक के साथ पंक्तियों को डिस्क पर भौतिक रूप से उसी क्रम में संग्रहीत किया जाता है जैसे सूचकांक। इसलिए, केवल एक संकुल सूचकांक हो सकता है।

एक गैर-संकुल सूचकांक के साथ एक दूसरी सूची होती है जिसमें भौतिक पंक्तियों के संकेत होते हैं। आपके पास कई गैर-संकुल सूचकांक हो सकते हैं, हालांकि प्रत्येक नए सूचकांक में नए रिकॉर्ड लिखने में लगने वाले समय में वृद्धि होगी।

यदि आप सभी स्तंभों को वापस प्राप्त करना चाहते हैं, तो एक संकुल अनुक्रमणिका से पढ़ना आम तौर पर तेज़ होता है। आपको पहले इंडेक्स और फिर टेबल पर नहीं जाना है।

यदि डेटा को पुनर्व्यवस्थित करने की आवश्यकता है, तो एक संकुल अनुक्रमणिका वाली तालिका में लिखना धीमा हो सकता है।


43
आपको स्पष्ट करना चाहिए कि "शारीरिक रूप से" से आपका क्या मतलब है।
स्पेन्सर रूपर्ट

141
शारीरिक रूप से डिस्क पर संग्रहीत वास्तविक बिट्स में
पीटर

17
Msdn का संदर्भ लें "जब आप एक प्राथमिक कुंजी बाधा बनाते हैं, तो कॉलम या स्तंभों पर एक अद्वितीय क्लस्टर इंडेक्स स्वचालित रूप से बनाया जाता है यदि टेबल पर क्लस्टर इंडेक्स पहले से मौजूद नहीं है", जिसका अर्थ है कि यह आवश्यक नहीं है कि एक ही कॉलम हो।
मिंग

46
@ पता है कि मामला नहीं है। SQL सर्वर निश्चित रूप से गारंटी नहीं देता है कि डिस्क के एक सन्निहित भौतिक क्षेत्र में सभी डेटा फाइलें रखी गई हैं और शून्य फाइल सिस्टम विखंडन है। यह भी सच नहीं है कि डेटा फ़ाइल के भीतर एक संकुल सूचकांक क्रम में है। जिस डिग्री का यह मामला नहीं है वह तार्किक विखंडन की डिग्री है।
मार्टिन स्मिथ

42
मार्टिन स्मिथ की बात का समर्थन करने के लिए एक त्वरित टिप्पणी - क्लस्टर इंडेक्स डिस्क पर अनुक्रमिक भंडारण की गारंटी नहीं देते हैं। ठीक उसी जगह पर प्रबंधन करना जहां डेटा को डिस्क पर रखा गया है ओएस का काम है, न कि डीबीएमएस। लेकिन यह बताता है कि आइटमों को आम तौर पर क्लस्टरिंग कुंजी के अनुसार ऑर्डर किया जाता है। इसका मतलब यह है कि अगर DB 10GB बढ़ता है, उदाहरण के लिए, OS डिस्क के विभिन्न हिस्सों पर 5x2GB विखंडू में 10GB लगाने का निर्णय ले सकता है। 10GB को कवर करने वाली एक संकुल तालिका को प्रत्येक 2GB चंक पर क्रमिक रूप से संग्रहीत किया जाएगा, उन 2GB चंक्स को क्रमिक नहीं किया जा सकता है।
blobbles

601

क्लस्टर किए गए इंडेक्स का मतलब है कि आप डेटाबेस को डिस्क पर वास्तव में एक-दूसरे के करीब के मूल्यों को स्टोर करने के लिए कह रहे हैं। यह तेजी से स्कैन / रिकॉर्ड की पुनर्प्राप्ति का लाभ संकुल सूचकांक मूल्यों की कुछ सीमा में गिर रहा है।

उदाहरण के लिए, आपके पास दो टेबल हैं, ग्राहक और ऑर्डर:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

यदि आप एक विशेष ग्राहक के सभी आदेशों को जल्दी से प्राप्त करना चाहते हैं, तो आप ऑर्डर टेबल के "CustomerID" कॉलम पर एक क्लस्टर इंडेक्स बनाना चाह सकते हैं। इस तरह एक ही CustomerID के साथ रिकॉर्ड डिस्क (क्लस्टर) पर एक दूसरे के करीब शारीरिक रूप से संग्रहीत किया जाएगा जो उनकी पुनर्प्राप्ति को गति देता है।

PS ग्राहक पर सूचकांक स्पष्ट रूप से अद्वितीय नहीं होगा, इसलिए आपको या तो सूचकांक को "विशिष्ट" करने के लिए एक दूसरे क्षेत्र को जोड़ने की आवश्यकता है या डेटाबेस को आपके लिए संभालना चाहिए लेकिन यह एक और कहानी है।

कई सूचकांक के संबंध में। आपके पास प्रति तालिका केवल एक क्लस्टर इंडेक्स हो सकता है क्योंकि यह परिभाषित करता है कि डेटा भौतिक रूप से कैसे व्यवस्थित किया जाता है। यदि आप एक सादृश्य चाहते हैं, तो इसमें कई तालिकाओं के साथ एक बड़े कमरे की कल्पना करें। आप इन तालिकाओं को कई पंक्तियों को बनाने के लिए रख सकते हैं या एक बड़ी सम्मेलन तालिका बनाने के लिए उन सभी को एक साथ खींच सकते हैं, लेकिन एक ही समय में दोनों तरीके नहीं। एक तालिका में अन्य सूचकांक हो सकते हैं, वे तब क्लस्टर इंडेक्स में प्रविष्टियों को इंगित करेंगे जो अपनी बारी में कहेंगे कि वास्तविक डेटा कहां मिलेगा।


4
कहा जा रहा है कि सीआई को हमेशा पीके के लिए इस्तेमाल किया जाना चाहिए
21

4
तो एक संकुल सूचकांक के साथ यह सूचकांक या तालिका में रिकॉर्ड हैं जो एक साथ संग्रहीत हैं?
कलस्टर

5
@ कैल्टर टेबल। सूचकांक को परिभाषा द्वारा आदेश दिया गया है। उदाहरण के लिए, btree का आदेश दिया जाएगा ताकि कोई व्यक्ति खोज करने के लिए केवल अंकगणित कर सके। क्लस्टर का विचार किसी विशेष सूचकांक के प्रदर्शन के लिए तालिका को पूरा करना है। स्पष्ट होने के लिए, तालिका के रिकॉर्ड को उस क्रम से मिलान करने के लिए फिर से व्यवस्थित किया जाएगा जो सूचकांक मूल रूप से है
FLGMwt

9
@ कैस्टर बिल्कुल नहीं! वास्तव में, प्रलेखन और नाम ही काफी भ्रामक हैं। "क्लस्टर इंडेक्स" होने से वास्तव में इंडेक्स के साथ बहुत कम होता है। वैचारिक रूप से, जो आपके पास वास्तव में है वह "सूचकांक x पर क्लस्टर की गई तालिका " है।
FLGMwt

3
@ JohnOrtizOrdoñez: बिल्कुल, आप लगभग किसी भी उपयोग कर सकते हैं कि के इन-पंक्ति संग्रहीत है, इसलिए कोई XML, VARCHAR(MAX), या VARBINARY(MAX)। ध्यान दें कि यह आमतौर पर दिनांक फ़ील्ड पर पहले क्लस्टर करने के लिए समझ में आता है , क्योंकि श्रेणी स्कैन के लिए क्लस्टर इंडेक्स सबसे अधिक कुशल है, जो दिनांक प्रकारों पर सबसे आम हैं। YMMV।

317

SQL सर्वर पंक्ति ओरिएंटेड स्टोरेज में क्लस्टर और नॉनक्लेस्टेड इंडेक्स दोनों को B ट्री के रूप में व्यवस्थित किया जाता है।

यहां छवि विवरण दर्ज करें

( छवि स्रोत )

क्लस्टर अनुक्रमित और गैर क्लस्टर अनुक्रमित के बीच मुख्य अंतर यह है कि संकुल अनुक्रमणिका की पत्ती स्तर है है तालिका। इसके दो निहितार्थ हैं।

  1. क्लस्टर किए गए अनुक्रमणिका पत्ता पृष्ठों पर पंक्तियों में हमेशा तालिका में प्रत्येक (नॉन स्पार्स) कॉलम के लिए कुछ होता है (या तो मान, या वास्तविक मूल्य के लिए एक संकेतक)।
  2. गुच्छेदार सूचकांक एक तालिका की प्राथमिक प्रति है।

गैर-संकुल अनुक्रमणिका INCLUDEखंड (SQL सर्वर 2005 के बाद से) का उपयोग करके बिंदु 1 को भी स्पष्ट रूप से सभी गैर-कुंजी स्तंभों में शामिल कर सकते हैं, लेकिन वे द्वितीयक अभ्यावेदन हैं और हमेशा डेटा की एक और प्रतिलिपि होती है (तालिका स्वयं के आसपास)।

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

ऊपर दिए गए दो सूचकांक लगभग समान होंगे। ऊपरी स्तर के इंडेक्स पेजों में प्रमुख कॉलम A,Bऔर लीफ लेवल पेजों के लिए मान होते हैंA,B,C,D

प्रति तालिका में केवल एक क्लस्टर इंडेक्स हो सकता है, क्योंकि डेटा पंक्तियों को केवल एक ही क्रम में क्रमबद्ध किया जा सकता है।

SQL सर्वर पुस्तकों से उपरोक्त उद्धरण ऑनलाइन बहुत भ्रम का कारण बनता है

मेरी राय में यह बहुत बेहतर होगा।

सिर्फ एक ही तालिका के अनुसार संकुल अनुक्रमणिका हो सकता है, क्योंकि संकुल अनुक्रमणिका की पत्ती स्तर पंक्तियों हैं तालिका पंक्तियों।

ऑनलाइन बोली गलत नहीं है, लेकिन आपको स्पष्ट होना चाहिए कि गैर-संकुल और क्लस्टर किए गए दोनों सूचकांकों का "क्रमबद्ध" भौतिक नहीं है। यदि आप लिंक किए गए सूची का अनुसरण करके पत्ती स्तर पर पृष्ठों को पढ़ते हैं और स्लॉट सरणी क्रम में पृष्ठ पर पंक्तियों को पढ़ते हैं तो आप अनुक्रमित पंक्तियों को क्रमबद्ध क्रम में पढ़ेंगे लेकिन शारीरिक रूप से पृष्ठों को क्रमबद्ध नहीं किया जा सकता है। आमतौर पर माना जाता है कि एक गुच्छेदार सूचकांक के साथ पंक्तियों को हमेशा डिस्क पर भौतिक रूप से उसी क्रम में संग्रहीत किया जाता है जैसे सूचकांक कुंजी झूठी है।

यह एक बेतुका कार्यान्वयन होगा। उदाहरण के लिए यदि एक पंक्ति एक 4GB तालिका के बीच में डाला जाता है एसक्यूएल सर्वर करता नहीं 2GB डेटा के नव डाला पंक्ति के लिए मेकअप के कमरे में फ़ाइल में कॉपी किया है।

इसके बजाय एक पृष्ठ विभाजन होता है। क्लस्टर्ड और नॉन क्लस्टर्ड इंडेक्स दोनों के लीफ लेवल के प्रत्येक पेज पर File:Pageतार्किक क्रम में अगले और पिछले पेज का पता ( ) होता है। इन पृष्ठों को या तो सन्निहित या प्रमुख क्रम में नहीं होना चाहिए।

उदाहरण के लिए लिंक की गई पृष्ठ श्रृंखला हो सकती है 1:2000 <-> 1:157 <-> 1:7053

जब पृष्ठ विभाजन होता है, तो फ़ाइल समूह में कहीं से भी एक नया पृष्ठ आवंटित किया जाता है (या तो एक मिश्रित सीमा से, छोटी तालिकाओं के लिए, या उस वस्तु से संबंधित एक गैर-रिक्त समान सीमा या एक नई आवंटित वर्दी सीमा)। यदि फ़ाइल समूह में एक से अधिक हो तो यह भी एक ही फ़ाइल में नहीं हो सकता है।

तार्किक भौतिक क्रम से भिन्न तार्किक क्रम और संदर्भता की डिग्री तार्किक विखंडन की डिग्री है।

एक एकल फ़ाइल के साथ एक नए बनाए गए डेटाबेस में मैं निम्नलिखित भाग गया।

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

फिर पेज लेआउट के साथ की जाँच की

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

परिणाम सभी जगह थे। मुख्य क्रम में पहली पंक्ति (मान 1 के साथ - नीचे तीर के साथ हाइलाइट किया गया) लगभग अंतिम भौतिक पृष्ठ पर था।

यहां छवि विवरण दर्ज करें

तार्किक क्रम और भौतिक क्रम के बीच सहसंबंध को बढ़ाने के लिए एक सूचकांक के पुनर्निर्माण या पुनर्गठन द्वारा विखंडन को कम या हटाया जा सकता है।

चलने के बाद

ALTER INDEX ix ON T REBUILD;

मुझे निम्नलिखित मिला

यहां छवि विवरण दर्ज करें

यदि तालिका में कोई क्लस्टर इंडेक्स नहीं है, तो इसे एक ढेर कहा जाता है।

नॉन क्लस्टर्ड इंडेक्स को ढेर या क्लस्टर इंडेक्स पर बनाया जा सकता है। उनके पास हमेशा बेस टेबल पर एक पंक्ति लोकेटर होता है। एक ढेर के मामले में यह एक भौतिक पंक्ति पहचानकर्ता (छुटकारा) है और इसमें तीन घटक होते हैं (फाइल: पेज: स्लॉट)। एक क्लस्टर इंडेक्स के मामले में पंक्ति लोकेटर तार्किक (क्लस्टर इंडेक्स कुंजी) है।

बाद के मामले के लिए यदि गैर-संकुल सूचकांक पहले से ही स्वाभाविक रूप से CI कुंजी कॉलम (ओं) में या तो NCI कुंजी कॉलम या INCLUDE-d कॉलम के रूप में शामिल है, तो कुछ भी नहीं जोड़ा जाता है। अन्यथा लापता सीआई कुंजी कॉलम (s) चुपचाप NCI में जुड़ जाते हैं।

SQL सर्वर हमेशा सुनिश्चित करता है कि कुंजी कॉलम दोनों प्रकार के सूचकांक के लिए अद्वितीय हैं। हालाँकि जिस तंत्र को यह इंडेक्स के लिए लागू किया जाता है, उसे दो इंडेक्स प्रकारों के बीच अद्वितीय अंतर के रूप में घोषित नहीं किया जाता है।

क्लस्टर किए गए इंडेक्स uniquifierको किसी भी पंक्तियों के लिए मुख्य मानों के साथ जोड़ा जाता है जो मौजूदा पंक्ति को डुप्लिकेट करते हैं। यह सिर्फ एक आरोही पूर्णांक है।

गैर-क्लस्टर किए गए अनुक्रमणिका के लिए अद्वितीय SQL सर्वर के रूप में घोषित नहीं किया गया है जो गैर-संकुल सूचकांक कुंजी में पंक्ति लोकेटर को चुपचाप जोड़ता है। यह सभी पंक्तियों पर लागू होता है, न कि केवल उन पर जो वास्तव में डुप्लिकेट हैं।

कॉलम स्टोर इंडेक्स के लिए क्लस्टर्ड बनाम नॉन क्लस्टर्ड नामकरण का भी उपयोग किया जाता है। SQL सर्वर स्तंभ स्टोर राज्यों के लिए कागज संवर्द्धन

यद्यपि किसी भी कुंजी पर कॉलम स्टोर डेटा वास्तव में "क्लस्टर" नहीं किया गया है, हमने प्राथमिक एसक्यूएल को क्लस्टर इंडेक्स के रूप में संदर्भित करने के पारंपरिक एसक्यूएल सर्वर सम्मेलन को बनाए रखने का फैसला किया।


8
@brainstorm हाँ मुझे इस बात की जानकारी है। संभवत: इस MSDN पृष्ठ पर फंतासिंग के कारण लेकिन यह देखने के लिए कि कुछ प्रहसन है कि आपको कुछ भ्रामक विषयों
मार्टिन स्मिथ

12
@ ब्रेनस्टॉर्म: यह आश्चर्यजनक है कि कैसे कुछ गलत बयानों को सुसमाचार के रूप में दोहराया जाता है। एक क्लस्टर इंगित करता है कि, अनुक्रमिक पढ़ने के दृष्टिकोण से कम से कम, यह "वांछनीय" होगा कि सूचकांक के रूप में एक ही क्रम में डिस्क पर भौतिक रूप से संग्रहीत पंक्तियाँ हों , लेकिन यह कहना बहुत दूर है कि यह वास्तव में उन्हें पैदा करेगा इस तरह से संग्रहित किया जाता है।
सुपरकैट

5
@MartinSmith मैंने आपके परीक्षण के परिणामों को पुन: पेश और पुष्टि की है SQL Server 2014। मुझे 95%प्रारंभिक डालने के बाद सूचकांक का विखंडन मिलता है । index rebuildविखंडन के बाद 0%और मूल्यों का आदेश दिया गया था। मैं सोच रहा हूँ, क्या हम ऐसा कह सकते हैं The only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0?
गुटका

8
@MartinSmith अब, सर, यह एक जवाब है। मैं इसे प्रतिक्रियाओं की सूची में सबसे ऊपर देखना पसंद करूंगा लेकिन जैसे ही एसओ जाता है, "त्वरित और सरल" को उत्थान मिलता है।
वैतत्र

5
@ मनचीच यह जवाब मूल प्रश्न पूछे जाने के 5 साल बाद दिया गया था। इसका उद्देश्य उन उत्तरों के कुछ भ्रामक पहलुओं को सही करना है। ओपी के (अब 8 साल के) गोरों को मेरी चिंता नहीं है। अन्य पाठक निचले स्तर के दृश्य की सराहना कर सकते हैं।
मार्टिन स्मिथ

149

मुझे लगता है कि यह एक बहुत पुराना प्रश्न है, लेकिन मुझे लगा कि मैं ऊपर दिए गए बारीक उत्तरों को समझने में मदद करने के लिए एक सादृश्य की पेशकश करूंगा।

अनुकूलित सूचकांक

यदि आप एक सार्वजनिक पुस्तकालय में चलते हैं, तो आप पाएंगे कि किताबें सभी एक विशेष क्रम में व्यवस्थित हैं (सबसे अधिक संभावना है डेवी दशमलव प्रणाली, या डीडीएस)। यह पुस्तकों के "क्लस्टर इंडेक्स" से मेल खाती है । यदि आपकी इच्छित पुस्तक के लिए DDS # है 005.7565 F736s, तो आप बुकशेल्व की पंक्ति का पता लगाकर शुरू करेंगे जो कि लेबल है 001-099या ऐसा कुछ है। (स्टैक के अंत में यह एंडकैप साइन इंडेक्स में एक "इंटरमीडिएट नोड" से मेल खाता है।) आखिरकार आप लेबल वाले विशिष्ट शेल्फ के नीचे ड्रिल करेंगे 005.7450 - 005.7600, फिर आप तब तक स्कैन करेंगे जब तक आपको निर्दिष्ट डीडीएस # के साथ पुस्तक नहीं मिली, और उस बिंदु पर आपको अपनी पुस्तक मिल गई है।

गैर-वर्गीकृत भारत

लेकिन अगर आप अपनी पुस्तक के डीडीएस # के साथ पुस्तकालय में नहीं आए हैं, तो आपको आपकी सहायता करने के लिए दूसरे सूचकांक की आवश्यकता होगी। पुराने दिनों में आपको पुस्तकालय के सामने "कार्ड कैटलॉग" के रूप में ज्ञात दराजों का एक अद्भुत ब्यूरो मिलेगा। इसमें हजारों 3x5 कार्ड थे - प्रत्येक पुस्तक के लिए, वर्णानुक्रम में क्रमबद्ध (शीर्षक से, शायद)। यह "नॉन-क्लस्टर्ड इंडेक्स" से मेल खाती है । ये कार्ड कैटलॉग एक पदानुक्रमित संरचना में आयोजित किए गए थे, ताकि प्रत्येक ड्रॉअर को इसमें निहित कार्ड की सीमा के साथ लेबल किया जाएगा ( Ka - Klउदाहरण के लिए, "," मध्यवर्ती नोड ")। एक बार फिर, आप अपनी पुस्तक मिलने तक ड्रिल करेंगे, लेकिन इस मामले में, एक बार जब आप इसे पा लेंगे (यानी, "लीफ नोड"), तो आपके पास पुस्तक ही नहीं है,अनुक्रमणिका संख्या (DDS #) जिसके साथ आप वास्तविक पुस्तक संकुल सूची में पा सकते हैं।

बेशक, कुछ भी लाइब्रेरियन को सभी कार्डों की फोटोकॉपी करने और एक अलग कार्ड कैटलॉग में एक अलग क्रम में सॉर्ट करने से नहीं रोकेंगे। (आमतौर पर कम से कम दो ऐसे कैटलॉग थे: एक लेखक के नाम से, और एक शीर्षक से।) सिद्धांत रूप में, आपके पास इनमें से कई "गैर-क्लस्टर" अनुक्रमित हो सकते हैं जैसा आप चाहते हैं।


2
मैं शायद, "शामिल" कॉलम का वर्णन करने के लिए इस सादृश्य का विस्तार कर सकता हूं , जिसका उपयोग गैर-क्लस्टर किए गए अनुक्रमित के साथ किया जा सकता है: एक कार्ड कैटलॉग में कार्ड की कल्पना कर सकता है, जिसमें केवल एक ही किताब से अधिक नहीं है, बल्कि सभी प्रकाशित की एक सूची है । पुस्तक के संस्करण, प्रकाशन की तारीख से संख्यात्मक रूप से व्यवस्थित। एक "शामिल कॉलम" की तरह यह जानकारी केवल पत्ती स्तर पर संग्रहीत की जाती है (इस प्रकार लाइब्रेरियन को कार्ड की संख्या कम करनी चाहिए)।
kmote

महान सादृश्य - वास्तव में यह कल्पना करने में मदद करता है!
डेनिस

71

गुच्छेदार और गैर-गुच्छेदार अनुक्रमित की कुछ विशेषताओं के नीचे खोजें:

गुच्छेदार सूचकांक

  1. क्लस्टर किए गए अनुक्रमणिका अनुक्रमणिका हैं जो SQL तालिका में पंक्तियों की विशिष्ट पहचान करते हैं।
  2. हर टेबल में एक क्लस्टर्ड इंडेक्स हो सकता है।
  3. आप एक क्लस्टर इंडेक्स बना सकते हैं जो एक से अधिक कॉलम को कवर करता है। उदाहरण के लिए create Index index_name(col1, col2, col.....):।
  4. डिफ़ॉल्ट रूप से, प्राथमिक कुंजी वाले एक कॉलम में पहले से ही एक संकुल सूचकांक होता है।

गैर-संकुलित सूचकांक

  1. गैर-क्लस्टर्ड इंडेक्स सरल इंडेक्स की तरह होते हैं। वे सिर्फ डेटा की तेजी से पुनर्प्राप्ति के लिए उपयोग किए जाते हैं। अद्वितीय डेटा होना निश्चित नहीं है।

34
बिंदु 1 के लिए एक मामूली सुधार। जरूरी नहीं कि SQL तालिका में पंक्तियों को विशिष्ट रूप से पहचाना जाए। यह एक प्रमुख कुंजी का कार्य है
निगेल

4
@ निगेल, एक प्राथमिक कुंजी या एक अद्वितीय सूचकांक?
अनार खलीलोव

व्यावहारिक और सीधा जवाब, धन्यवाद @ अनिरुद्ध सूद
ऑस्कर रोमेरो

50

एक बहुत ही सरल, गैर-तकनीकी नियम यह होगा कि क्लस्टर इंडेक्स आमतौर पर आपकी प्राथमिक कुंजी (या, कम से कम, एक अद्वितीय स्तंभ) के लिए उपयोग किए जाते हैं और गैर-क्लस्टर अन्य स्थितियों (शायद एक विदेशी कुंजी) के लिए उपयोग किए जाते हैं । दरअसल, SQL सर्वर डिफ़ॉल्ट रूप से आपके प्राथमिक कुंजी कॉलम (ओं) पर एक क्लस्टर इंडेक्स बनाएगा। जैसा कि आपने सीखा होगा, क्लस्टर इंडेक्स का संबंध डिस्क पर भौतिक रूप से सॉर्ट करने से है, जिसका अर्थ है कि यह अधिकांश स्थितियों के लिए एक अच्छा ऑल-राउंड विकल्प है।


47

गुच्छेदार सूचकांक

एक संकुल सूचकांक तालिका में डेटा के भौतिक क्रम को निर्धारित करता है। इस कारण से एक तालिका में केवल 1 क्लस्टर सूचकांक होता है।

  • " डिक्शनरी " किसी अन्य इंडेक्स की जरूरत नहीं, शब्दों के अनुसार इसका पहले से ही इंडेक्स

गैर-सूचीबद्ध सूचकांक

एक नॉन क्लस्टर क्लस्टर इंडेक्स बुक में एक इंडेक्स के अनुरूप होता है। डेटा एक ही स्थान पर संग्रहीत होता है। इंडेक्स दूसरी जगह पर स्टोर हो रहा है और इंडेक्स में डेटा के स्टोरेज लोकेशन पर पॉइंटर्स हैं। इस कारण से टेबल में 1 नॉनक्लेस्टेड इंडेक्स है।

  • " केमिस्ट्री बुक" में अध्याय स्थान को इंगित करने के लिए एक अलग सूचकांक होता है और "END" में एक और सूचकांक होता है जो सामान्य स्थान को इंगित करता है।

6

गुच्छेदार सूचकांक

क्लस्टर किए गए अनुक्रमणिका तालिका में डेटा पंक्तियों को सॉर्ट और संग्रहीत करते हैं या उनके प्रमुख मूल्यों के आधार पर देखते हैं। ये सूचकांक परिभाषा में शामिल किए गए कॉलम हैं। प्रति तालिका में केवल एक क्लस्टर इंडेक्स हो सकता है, क्योंकि डेटा पंक्तियों को केवल एक ही क्रम में क्रमबद्ध किया जा सकता है।

केवल तालिका में डेटा पंक्तियाँ क्रमबद्ध क्रम में संग्रहीत होती हैं, जब तालिका में क्लस्टर अनुक्रमणिका होती है। जब किसी टेबल में क्लस्टर इंडेक्स होता है, तो टेबल को क्लस्टर टेबल कहा जाता है। यदि किसी तालिका में कोई क्लस्टर इंडेक्स नहीं है, तो उसकी डेटा पंक्तियों को एक अनियंत्रित संरचना में संग्रहीत किया जाता है जिसे एक ढेर कहा जाता है।

nonclustered

गैर-अनुक्रमित अनुक्रमित में डेटा पंक्तियों से अलग एक संरचना होती है। नॉनक्लेस्टेड इंडेक्स में नॉनक्लेस्टेड इंडेक्स की वैल्यूज होती हैं और प्रत्येक की-वैल्यू एंट्री में डेटा रो के लिए एक पॉइंटर होता है जिसमें की-वैल्यू होती है। किसी गैर-क्रमानुसार अनुक्रमणिका में डेटा पंक्ति से सूचक को पंक्ति लोकेटर कहा जाता है। पंक्ति लोकेटर की संरचना इस बात पर निर्भर करती है कि डेटा पृष्ठों को ढेर या संकुल तालिका में संग्रहीत किया जाता है या नहीं। एक ढेर के लिए, एक पंक्ति लोकेटर पंक्ति का एक संकेतक है। एक संकुल तालिका के लिए, पंक्ति लोकेटर संकुल सूचकांक कुंजी है।

आप गैर-क्रस्ट किए गए इंडेक्स की लीफ लेवल पर नॉन कॉलम कॉलम को मौजूदा इंडेक्स की लिमिट्स को बाय-पास कर सकते हैं, और पूरी तरह से कवर, इंडेक्स किए गए, क्वेरी को निष्पादित कर सकते हैं। अधिक जानकारी के लिए, शामिल स्तंभों के साथ अनुक्रमणिका बनाएँ देखें। सूचकांक कुंजी सीमाओं के बारे में विवरण के लिए SQL सर्वर के लिए अधिकतम क्षमता विनिर्देश देखें।

संदर्भ: https://docs.microsoft.com/en-us/sql/relational-dat डेटाबेस/ indexes/ clustered-and- nonclustered- indexes- described


4

मुझे "क्लस्टरिंग इंडेक्स" पर एक पाठ्यपुस्तक की परिभाषा प्रदान करें, जो डेटाबेस सिस्टम से 15.6.1 से ली गई है : संपूर्ण पुस्तक :

हम क्लस्टरिंग इंडेक्स की भी बात कर सकते हैं , जो एक विशेषता या विशेषताओं पर अनुक्रमित होते हैं, जैसे कि इस इंडेक्स की खोज कुंजी के लिए निश्चित मूल्य के साथ सभी ट्यूपल लगभग कुछ ब्लॉकों पर दिखाई देते हैं जितना कि उन्हें पकड़ सकते हैं।

परिभाषा को समझने के लिए, आइए पाठ्यपुस्तक द्वारा दिए गए उदाहरण 15.10 पर एक नज़र डालें:

एक संबंध R(a,b)जो विशेषता पर सॉर्ट किया aजाता है और उस क्रम में संग्रहीत किया जाता है, जिसे ब्लॉक में पैक किया जाता है, निश्चित रूप से क्लस्टर होता है। एक इंडेक्स aएक क्लस्टरिंग इंडेक्स है, क्योंकि दिए गए a-वल्यू a1 के लिए, उस मूल्य के सभी ट्यूपल aलगातार होते हैं। वे इस प्रकार ब्लॉक में भरे हुए दिखाई देते हैं, संभवत: पहले और आखिरी ब्लॉकों के लिए एक्सेप्ट करते हैं, जिनमें -1 एवल्यू होता है a, जैसा कि अंजीर में दिखाया गया है ।.1.1.14। हालांकि, ख पर एक सूचकांक, क्लस्टरिंग होने की संभावना नहीं है, क्योंकि साथ tuples तय एक b-value सब जब तक के मूल्यों फ़ाइल में फैला दिया जाएगा aऔर bबहुत बारीकी से सहसंबंध हैं।

अंजीर 15.14

ध्यान दें कि परिभाषा को लागू नहीं करता है डेटा ब्लॉक को डिस्क पर सन्निहित होना चाहिए; यह केवल कहता है कि खोज कुंजी के साथ tuples संभव के रूप में कुछ डेटा ब्लॉक में पैक किए गए हैं।

एक संबंधित अवधारणा गुच्छेदार संबंध है । एक संबंध "क्लस्टर्ड" है यदि इसके ट्यूपल्स को लगभग कुछ ब्लॉकों में पैक किया जाता है जैसा कि संभवतः उन ट्यूपल्स को पकड़ सकता है। दूसरे शब्दों में, डिस्क ब्लॉक परिप्रेक्ष्य से, यदि इसमें विभिन्न संबंधों से ट्यूपल्स शामिल हैं, तो उन संबंधों को जोड़ा नहीं जा सकता है (यानी, अन्य डिस्क ब्लॉक से उस संबंध के ट्यूपलों को स्वैप करके इस तरह के संबंध को संग्रहीत करने के लिए एक अधिक पैक तरीका है। tuples वर्तमान डिस्क ब्लॉक में संबंध से संबंधित नहीं है)। स्पष्ट रूप से, R(a,b)ऊपर दिए गए उदाहरण में क्लस्टर किया गया है।

दो अवधारणाओं को एक साथ जोड़ने के लिए, एक गुच्छित संबंध एक क्लस्टरिंग इंडेक्स और नॉनक्लस्टिंग इंडेक्स हो सकता है। हालांकि, गैर-संकुल संबंध के लिए, क्लस्टरिंग इंडेक्स तब तक संभव नहीं है जब तक कि संबंध के प्राथमिक कुंजी के शीर्ष पर सूचकांक का निर्माण नहीं किया जाता है।

एक शब्द के रूप में "क्लस्टर" डेटाबेस भंडारण पक्ष के सभी अमूर्त स्तरों (अमूर्त के तीन स्तरों: ट्यूपल्स, ब्लॉक, फ़ाइल) में स्पैम किया गया है। " क्लस्टर्ड फाइल " नामक एक अवधारणा , जो बताती है कि क्या एक फाइल (ब्लॉक के समूह (एक या अधिक डिस्क ब्लॉक) के लिए एक अमूर्त) में एक संबंध या अलग-अलग संबंधों से ट्यूपल्स होते हैं। यह क्लस्टर इंडेक्स अवधारणा से संबंधित नहीं है क्योंकि यह फ़ाइल स्तर पर है।

हालाँकि, कुछ शिक्षण सामग्री क्लस्टर फ़ाइल परिभाषा के आधार पर क्लस्टरिंग इंडेक्स को परिभाषित करना पसंद करती है। उन दो प्रकार की परिभाषाएँ संकुल संबंध स्तर पर समान हैं, चाहे वे डेटा डिस्क ब्लॉक या फ़ाइल के संदर्भ में संकुल संबंध को परिभाषित करते हों। इस अनुच्छेद के लिंक से,

किसी फ़ाइल पर विशेषता (ओं) पर एक अनुक्रमणिका एक क्लस्टरिंग इंडेक्स है जब: विशेषता मान A = के साथ सभी tuples डेटा फ़ाइल में क्रमिक रूप से (= लगातार) संग्रहीत किए जाते हैं

लगातार ट्यूपल्स को संचय करना यह कहने के समान है कि "ट्यूपल्स को लगभग कुछ ब्लॉकों में पैक किया जाता है क्योंकि संभवतः उन ट्यूपल्स को पकड़ सकते हैं" (फ़ाइल के बारे में एक बात पर मामूली अंतर के साथ, दूसरे डिस्क के बारे में बात करते हुए)। यह इसलिए है क्योंकि लगातार ट्यूपल को संचय करना "कुछ ब्लॉकों के रूप में मोटे तौर पर पैक किए जाने को प्राप्त करने का तरीका है जो संभवतः उन ट्यूपल्स को पकड़ सकते हैं"।


3

क्लस्टर किए गए सूचकांक: प्राथमिक कुंजी बाधा स्वचालित रूप से तालिका पर कोई क्लस्टर सूचकांक मौजूद होने पर स्वचालित रूप से संकुल सूचकांक बनाता है। गुच्छित सूचकांक का वास्तविक डेटा सूचकांक के पत्ती स्तर पर संग्रहीत किया जा सकता है।

नॉन क्लस्टर्ड इंडेक्स: नॉन क्लस्टर्ड इंडेक्स का वास्तविक डेटा सीधे लीफ नोड पर नहीं पाया जाता है, इसके बजाय इसे खोजने के लिए एक अतिरिक्त कदम उठाना पड़ता है क्योंकि इसमें केवल वास्तविक डेटा की ओर इशारा करने वाले पंक्ति लोकेटर के मान होते हैं। गैर क्लस्टर इंडेक्स को क्रस्टर्ड इंडेक्स के रूप में सॉर्ट नहीं किया जा सकता है। प्रति तालिका में कई गैर-संकुल सूचकांक हो सकते हैं, वास्तव में यह उस sql सर्वर संस्करण पर निर्भर करता है जिसका हम उपयोग कर रहे हैं। मूल रूप से एसक्यूएल सर्वर 2005 249 नॉन क्लस्टर्ड इंडेक्स की अनुमति देता है और 2008, 2016 जैसे उपरोक्त संस्करणों के लिए, यह प्रति टेबल 999 गैर क्लस्टर इंडेक्स की अनुमति देता है।


2

क्लस्टर किए गए सूचकांक - एक संकुल सूचकांक उस क्रम को परिभाषित करता है जिसमें डेटा को तालिका में भौतिक रूप से संग्रहीत किया जाता है। तालिका डेटा को केवल एक ही तरीके से क्रमबद्ध किया जा सकता है, इसलिए, प्रति तालिका केवल एक संकुल सूचकांक हो सकता है। SQL सर्वर में, प्राथमिक कुंजी बाधा स्वचालित रूप से उस विशेष स्तंभ पर एक क्लस्टर इंडेक्स बनाती है।

गैर-संकुल सूचकांक- एक गैर-संकुल सूचकांक तालिका के अंदर भौतिक डेटा को सॉर्ट नहीं करता है। वास्तव में, एक गैर-संकुल सूचकांक एक स्थान पर संग्रहीत किया जाता है और तालिका डेटा को दूसरी जगह संग्रहीत किया जाता है। यह एक पाठ्यपुस्तक के समान है जहां पुस्तक सामग्री एक स्थान पर और सूचकांक दूसरी जगह स्थित है। यह प्रति तालिका एक से अधिक गैर-क्लस्टर किए गए अनुक्रमणिका के लिए अनुमति देता है। यहां यह उल्लेख करना महत्वपूर्ण है कि तालिका के अंदर डेटा को एक गुच्छित सूचकांक द्वारा क्रमबद्ध किया जाएगा। हालांकि, गैर-संकुल सूचकांक डेटा के अंदर निर्दिष्ट क्रम में संग्रहीत किया जाता है। अनुक्रमणिका में स्तंभ मान होते हैं, जिस पर अनुक्रमणिका बनाई जाती है और रिकॉर्ड का वह स्तंभ जिसका मान स्तंभ का होता है। जब कोई क्वेरी उस स्तंभ के विरुद्ध जारी की जाती है, जिस पर सूचकांक बनाया जाता है, तो डेटाबेस पहले सूचकांक में जाएगा और खोज करेगा तालिका में संबंधित पंक्ति का पता। यह उस पंक्ति पते पर जाएगा और अन्य कॉलम मान प्राप्त करेगा। यह इस अतिरिक्त कदम के कारण है कि गैर-क्लस्टर किए गए अनुक्रमित क्लस्टर अनुक्रमित की तुलना में धीमी हैं

गुच्छेदार और गैर-संकुल सूचकांक के बीच अंतर

  1. प्रति तालिका केवल एक संकुल सूचकांक हो सकता है। हालाँकि, आप एक एकल तालिका पर कई गैर-क्लस्टर किए गए अनुक्रमणिका बना सकते हैं।
  2. क्लस्टर किए गए अनुक्रमणिका केवल तालिकाएँ सॉर्ट करते हैं। इसलिए, वे अतिरिक्त भंडारण का उपभोग नहीं करते हैं। गैर-संकुल अनुक्रमणिका को अधिक संग्रहण स्थान का दावा करने वाली वास्तविक तालिका से अलग स्थान पर संग्रहीत किया जाता है।
  3. क्लस्टर्ड इंडेक्स गैर-क्लस्टर इंडेक्स की तुलना में तेज़ होते हैं क्योंकि वे किसी भी अतिरिक्त लुकअप चरण को शामिल नहीं करते हैं।

अधिक जानकारी के लिए इस लेख को देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.