2009-05-03 12 views
7
CREATE NONCLUSTERED INDEX index_name 
    ON <object> (column [ ASC | DESC ] [ ,...n ]) 
    [ INCLUDE (column_name [ ,...n ]) ] 
    [ WHERE <filter_predicate> ] 

उपर्युक्त वाक्यविन्यास में हम INCLUDE में गैर-कुंजी कॉलम निर्दिष्ट करेंगे। गैर-कुंजी कॉलम निर्दिष्ट करने में क्या फायदा है?SQL सर्वर अनुक्रमणिका के साथ एक INCLUDE कॉलम का उपयोग करने का क्या फायदा है?

उत्तर

1

यह इंडेक्स का उपयोग करने वाले प्रश्नों पर तेजी से पहुंच के लिए इंडेक्स नोड के साथ कॉलम के लिए डेटा संग्रहीत करेगा।

Reference:

में शामिल हैं (स्तंभ [... n])

nonclustered अनुक्रमणिका की पत्ती के स्तर को जोड़ा जा करने के लिए गैर-प्रमुख कॉलम निर्दिष्ट करता है। Nonclustered सूचकांक अद्वितीय या गैर अद्वितीय हो सकता है।

6

जब एक सूचकांक प्रयोग किया जाता है, यह या तो पूरा रिकार्ड, या सभी क्षेत्रों आप की जरूरत सूचकांक अपने आप में संग्रहित किया जा सकता के स्थान को जन्म दे सकता (ताकि आप रिकॉर्ड को पूरा करने के लिए जाने की जरूरत नहीं है।)

पहले मामले में, आपके पास दो सबसे अच्छे मामले हैं, एक सूचकांक पढ़ने के लिए, और एक पूर्ण रिकॉर्ड पढ़ने के लिए।

दूसरे मामले में, आपको इंडेक्स पढ़ने से आपको जो कुछ चाहिए, वह आपको मिलता है।

यदि आप इंडेक्स समेत फ़ील्ड (ओं) के साथ मिलकर अतिरिक्त कॉलम को इंडेक्स के साथ संग्रहीत करने के लिए शामिल कर सकते हैं, तो आपके पास पंक्ति के अतिरिक्त पढ़ने की आवश्यकता के बिना संतुष्ट पूर्ण प्रश्न हैं।

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

यदि आप अनुक्रम में कई इंडेक्स कुंजियां पढ़ रहे हैं तो एक विशेष रूप से बड़ा फायदा होता है (उदाहरण के लिए चुनें ... से ... जहां एन 1 और एन 2 के बीच कुंजियां हैं) क्योंकि इंडेक्स पढ़ता है, संभवतः एक दूसरे के समीप संग्रहीत किया जाएगा और शायद केवल एक या दो भौतिक क्षेत्रों के साथ पढ़ा जा सकता है; और शेष रिकॉर्ड खोजने की आवश्यकता नहीं है और अधिक लाभ प्रदान करता है।

+1

कारण है कि यह क्लस्टर सूचकांक – Andomar

0

यदि क्वेरी शामिल कॉलम का उपयोग करती है तो यह एक मुख्य लुकअप करने की आवश्यकता को हटा देती है। उदाहरण।

select ssn, firstname from myusers where ssn='111-11-1111' 

एक उपयुक्त सूचकांक इस

create index idx_user_ssn nonclustered on myusers(ssn) include(firstname) 
+0

आपको बहुत बहुत – Anoop

29

कैसा दिखेगा मान लेते हैं आप एक कर्मचारी तालिका इसलिए की तरह करते हैं:

CREATE TABLE Employee(EmployeeID INT IDENTITY(1,1) PRIMARY KEY, 
         LastName VARCHAR(50), 
         FirstName VARCHAR(50), 
         HireDate DATETIME, 
         Salary DECIMAL) 

आप EmployeeID पर प्राथमिक क्लस्टर कुंजी है, और संभवतः नाम से कर्मचारियों को खोजने में सक्षम होने के लिए (अंतिम नाम, फर्स्टनाम) पर एक गैर-क्लस्टर कुंजी।

CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC) 

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

हालांकि: अगर आपका नाम आधारित गैर क्लस्टर सूचकांक भी निर्दिष्ट करता है "में शामिल हैं (HireDate, वेतन)":

CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC) 
     INCLUDE (HireDate, Salary) 

तो एसक्यूएल सर्वर से किया जाता है एक बार यह गैर क्लस्टर नाम पर जो मर्फी ऊपर देखा है अनुक्रमणिका -> आपकी क्वेरी को संतुष्ट करने के लिए सभी फ़ील्ड गैर-क्लस्टर इंडेक्स में हैं, इसलिए डिस्क-गहन बुकमार्क लुकअप करने की कोई आवश्यकता नहीं है और आपके प्रश्न संभावित रूप से बहुत तेज़ होंगे।

INCLUDE कॉलम का नकारात्मक हिस्सा गैर-क्लस्टर इंडेक्स द्वारा डिस्क-स्पेस की आवश्यकता में वृद्धि हुई है, क्योंकि उनके पत्ते-स्तर नोड्स में शामिल कॉलम होंगे। यह गति और आकार (सामान्य के रूप में) के बीच एक व्यापार-बंद है।

मार्क

+1

महान स्पष्टीकरण धन्यवाद ... आपको बहुत बहुत – Anoop

+1

गंभीरता से सही धन्यवाद पर लागू नहीं होता की अच्छी व्याख्या! –

+1

एक कुरकुरा और स्पष्ट जवाब – Nicool

0

का लाभ शामिल सूचकांक आकार सीमा से बचना है।

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode 
FROM Person.Address 
WHERE PostalCode BETWEEN N'98000' and N'99999' 

यद्यपि आप कुंजी स्तंभों के रूप में सभी स्तंभों को परिभाषित कर सकता है, कुंजी आकार 334 bytes.Only मानदंड क्या होगा हम यहाँ का उपयोग कर रहा है PostalCode, keycolumn में PostalCode का उपयोग करना और गैर प्रमुख स्तंभ पर आराम प्रदर्शन में सुधार होगा और आकार भी बचाता है।

CREATE INDEX IX_Address_PostalCode 
ON Person.Address (PostalCode) 
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); 
संबंधित मुद्दे