2010-03-13 17 views
13

मैं हाल ही में एक डेटाबेस मैं कहना है कि फार्म की थी में एक सूचकांक का सामना करना पड़ा में क्यों शामिल:उपयोग किसी SQL सूचकांक

CREATE INDEX [IX_Foo] ON [Foo] 
(Id ASC) 
INCLUDE 
(SubId) 

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

यह मुझे सोच रहा है कि मुझे कॉलम के पीछे तर्क को समझ में नहीं आता है, जब आम तौर पर, वे केवल इंडेक्स का हिस्सा बन सकते हैं। यहां तक ​​कि यदि मैं विशेष रूप से इंडेक्स में होने वाली वस्तुओं के बारे में विशेष रूप से परवाह नहीं करता हूं, तो भी शामिल होने के बजाय इंडेक्स में कॉलम होने का कोई नकारात्मक पक्ष है।

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

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

मैं डेटाबेस में अन्य अनुक्रमणिका के माध्यम से जाने पर विचार कर रहा हूं और जहां संभव हो वहां सूचकांक में स्तंभों को स्थानांतरित करना शामिल है। क्या यह एक गलती होगी?

मैं मुख्य रूप से एमएस एसक्यूएल सर्वर में रूचि रखता हूं, लेकिन अन्य डीबी इंजनों की जानकारी भी स्वागत है।

उत्तर

8

अब तक के उत्तर सभी सही और सभी हैं - लेकिन हो सकता है कि वे कवरेज इंडेक्स से जो कुछ हासिल करते हैं उसे पर्याप्त न बताएं।

आपके मामले में, आप एक तालिका Foo और एक Id (जो मुझे लगता है प्राथमिक कुंजी है) सहित कुछ क्षेत्रों, है, और एक SubId जो किसी तरह के कुछ अतिरिक्त आईडी है।

आपके पास एक सूचकांक IX_Foo भी है जो मुझे लगता है कि इसमें अभी केवल Id था।

तो अब आपको के लिए SubId खोजने की आवश्यकता है।

SELECT Id, SubId 
FROM Foo 
WHERE Id=4 
  • एसक्यूएल सर्वर SELECT कथन को देखो और निर्धारित यह IX_Foo
  • उपयोग कर सकते हैं अपने सूचकांक में मूल्य Id=4 के लिए खोज IX_Foo
  • जब यह यह पाता है, यह अब की जरूरत है यह तो जाने देंगे SubId का मान,
  • गैर-क्लस्टर सूचकांक IX_Foo में क्लस्टरिंग कुंजी मान
  • उस क्लिप का उपयोग कर होगा कुंजी मान ustering, एसक्यूएल सर्वर वास्तविक डेटा पेज जहां अपने पूरे डेटा पंक्ति स्थित है
  • यह है कि पेज लायेगा का पता लगाने और इसे से SubId के लिए मूल्य निकालने
  • यह उन मूल्यों को वापस आ जाएगी करने के लिए एक "बुकमार्क देखने" क्या करेंगे आपकी क्वेरी

मुख्य बिंदु यहाँ संतुष्ट करने के लिए है: एक बार एसक्यूएल सर्वर IX_Foo सूचकांक में अपने Id=4 पाया गया है, यह तो पूरे डेटा लाने जाने के लिए, एक और मैं/हे आपरेशन, एक बुकमार्क देखने करने की आवश्यकता होगी पंक्ति, SubId मान खोजने में सक्षम होने के लिए।

यदि आपके पास कवरेज इंडेक्स है, उदा। IX_Foo में SubId भी शामिल है, जो बुकमार्क लुकअप करने के लिए अतिरिक्त I/O समाप्त हो गया है। एक बार मूल्य Id=4IX_Foo अनुक्रमणिका में पाया जाता है, तो आपके गैर-क्लस्टर इंडेक्स में इंडेक्स पेज में SubId का मान भी शामिल होगा - SQL सर्वर अब उन दो मानों को वापस कर सकता है जिन्हें आपने अपनी SELECT क्वेरी में के बिना पूछा है एक और आईडी कॉलम लाने के लिए अतिरिक्त (संभावित रूप से महंगा और इस प्रकार धीमा) बुकमार्क लुकअप।

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

अद्यतन: व्यापार बंद यह है: अगर तुम पर (क्रमांक, SUBID) एक सूचकांक है, अनुक्रमणिका के सभी पृष्ठों दोनों स्तंभ है - पूरे सूचकांक पेड़ के माध्यम से।

यदि आप शामिल हैं (सबआईडी), उप-फ़ील्ड फ़ील्ड केवल पत्ती के स्तर पर मौजूद हैं।

इसका मतलब यह है

  • एसक्यूएल सर्वर खोज नहीं कर सकते और SUBID पर तुलना (मूल्यों सूचकांक पेड़ में नहीं हैं)
  • कम जगह प्रयोग किया जाता है के बाद से मूल्यों केवल पत्ती स्तर पर कर रहे हैं
+0

मैं उस हिस्से को समझता हूं। असली सवाल आईडीआई और सबआईडी बनाम इंडेक्स और सब आईडी सहित आईडी पर इंडेक्स के बीच ट्रेडऑफ के बारे में है। – StarLite

+0

@StarLIte: मेरी पोस्ट –

+1

@marc_s के व्यापार लाभ की व्याख्या को 'INCLUDE' का एक अन्य लाभ यह है कि अद्यतन कॉलम को केवल प्रभावित करने वाले अपडेट सस्ता हैं क्योंकि इंडेक्स को परिवर्तनों के लिए पुनः व्यवस्थित करने की आवश्यकता नहीं है कॉलम शामिल –

7

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

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

+5

इंडेक्स (केवल एक कुंजी के रूप में) जोड़ने के बजाय कॉलम को कवर करने का एक और ब्याज यह है कि ऐसे कॉलम केवल इंडेक्स के पत्ते में जोड़े जाते हैं, आम तौर पर इंडेक्स को छोटे और अधिक कुशल बनाते हैं। – mjv

+0

यह वही है जो मैं सोच रहा था। मेरे परिदृश्य में जिस तालिका के साथ मैं काम कर रहा हूं वह है (अनिवार्य रूप से) केवल पढ़ने के लिए, इसलिए अतिरिक्त काम के लिए वास्तव में कोई नकारात्मक पक्ष नहीं है जो अद्यतन पर किया जाना होगा।@ एमजेवी के पास गैर-पत्ते वाले पृष्ठों में शामिल कॉलम के मूल्य को दोहराने के लिए सूचकांक के आकार के बारे में एक बिंदु है, लेकिन मुझे अपने विशेष परिदृश्य में पर्याप्त आकार अंतर नहीं दिख रहा है। मैं आगे बढ़ने जा रहा हूं और दुर्लभ मामले को संभालने के लिए उचित इंडेक्स में असम्बद्ध कॉलम डाल रहा हूं जहां वह कॉलम खोज मानदंड का हिस्सा है। – StarLite

3

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

संबंधित मुद्दे