SQL सर्वर पंक्ति ओरिएंटेड स्टोरेज में क्लस्टर और नॉनक्लेस्टेड इंडेक्स दोनों को B ट्री के रूप में व्यवस्थित किया जाता है।
( छवि स्रोत )
क्लस्टर अनुक्रमित और गैर क्लस्टर अनुक्रमित के बीच मुख्य अंतर यह है कि संकुल अनुक्रमणिका की पत्ती स्तर है है तालिका। इसके दो निहितार्थ हैं।
- क्लस्टर किए गए अनुक्रमणिका पत्ता पृष्ठों पर पंक्तियों में हमेशा तालिका में प्रत्येक (नॉन स्पार्स) कॉलम के लिए कुछ होता है (या तो मान, या वास्तविक मूल्य के लिए एक संकेतक)।
- गुच्छेदार सूचकांक एक तालिका की प्राथमिक प्रति है।
गैर-संकुल अनुक्रमणिका 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 सर्वर स्तंभ स्टोर राज्यों के लिए कागज संवर्द्धन
यद्यपि किसी भी कुंजी पर कॉलम स्टोर डेटा वास्तव में "क्लस्टर" नहीं किया गया है, हमने प्राथमिक एसक्यूएल को क्लस्टर इंडेक्स के रूप में संदर्भित करने के पारंपरिक एसक्यूएल सर्वर सम्मेलन को बनाए रखने का फैसला किया।