मैंने इस सवाल पर थोड़ा खुदाई करने का फैसला किया है और मुझे कुछ दिलचस्प दस्तावेजों के बारे में पता चला है कि कैसे और कब उपयोग किया जाता है या बेहतर हो सकता है, गैर-संकुल सूचकांक के उपयोग (बल) का उपयोग नहीं करना चाहिए।
जैसा कि जॉन Eisbrener की टिप्पणियों के अनुसार , सबसे संदर्भित में से एक है, यहां तक कि दूसरों के ब्लॉग में भी, किम्बरली एल। ट्रिप्प का यह दिलचस्प लेख है:
लेकिन यह केवल एक ही नहीं है, यदि आप रुचि रखते हैं तो आप इस पृष्ठ पर एक नज़र डाल सकते हैं:
जैसा कि आप देख सकते हैं, ये सभी टिपिंग बिंदु की अवधारणा के चारों ओर घूमते हैं ।
केएल ट्रिप लेख से उद्धृत
टिपिंग बिंदु क्या है?
यह वह बिंदु है जहाँ पंक्तियों की संख्या " अब पर्याप्त चयनात्मक नहीं " है। SQL सर्वर गैर-संकुल अनुक्रमणिका का उपयोग करने के लिए संबंधित डेटा पंक्तियों को देखने के लिए नहीं चुनता है और इसके बजाय एक तालिका स्कैन करता है।
जब SQL सर्वर एक ढेर पर एक गैर-संकुल सूचकांक का उपयोग करता है, तो मूल रूप से यह आधार तालिका के पन्नों की ओर इशारा करता है। फिर यह रो आईडी लुकअप (आरआईडी) नामक संचालन की एक श्रृंखला के साथ पंक्तियों को पुनः प्राप्त करने के लिए इन बिंदुओं का उपयोग करता है। इसका मतलब है कि कम से कम, यह कई पेज रीड का उपयोग करेगा क्योंकि पंक्तियों की संख्या वापस आ गई है, और शायद किसी भी अधिक। यह प्रक्रिया बेस टेबल के रूप में क्लस्टर इंडेक्स के साथ कुछ समान है, जिसके परिणाम समान हैं: अधिक पढ़ता है।
लेकिन, जब वह टिपिंग बिंदु होता है?
बेशक इस जीवन में ज्यादातर चीजें हैं, यह निर्भर करता है ...
गंभीरता से नहीं, यह प्रति पृष्ठ कितनी पंक्तियों के आधार पर तालिका में पृष्ठों की संख्या के 25% से 33% के बीच होता है। लेकिन ऐसे और भी कारक हैं जिन पर आपको विचार करना चाहिए:
ITPRoToday लेख से उद्धृत
टिपिंग प्वाइंट को प्रभावित करने वाले अन्य कारक हालांकि RID लुकअप की लागत सबसे महत्वपूर्ण कारक है जो टिपिंग बिंदु को प्रभावित करता है, कई अन्य कारक हैं:
- फिजिकल इंडेक्स को स्कैन करते समय फिजिकल I / O ज्यादा कुशल होता है। अनुक्रमणिका क्रम में डिस्क पर क्रस्टर्ड इंडेक्स डेटा को क्रमिक रूप से रखा गया है। नतीजतन, डिस्क पर बहुत कम पार्श्व सिर की यात्रा होती है, जो I / O प्रदर्शन में सुधार करती है।
- जब डेटाबेस इंजन एक क्लस्टर इंडेक्स को स्कैन कर रहा होता है, तो यह जानता है कि एक उच्च संभावना है कि डिस्क ट्रैक पर अगले कुछ पेज अभी भी डेटा की आवश्यकता होगी। तो, यह सामान्य 8KB पृष्ठों के बजाय 64KB विखंडू में आगे पढ़ना शुरू करता है। यह भी तेजी से मैं / हे में परिणाम है।
अब अगर मैं सांख्यिकी IO का उपयोग करके अपने प्रश्नों को फिर से निष्पादित करता हूं:
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WHERE nki < 20000 ORDER BY nki ;
SET STATISTICS IO OFF;
Logical reads: 312
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WITH(INDEX(IX_my_TABLE));
SET STATISTICS IO OFF;
Logical reads: 41293
दूसरी क्वेरी को पहले वाले की तुलना में अधिक तार्किक रीड की आवश्यकता है।
क्या मुझे गैर-संकुलित सूचकांक से बचना चाहिए?
नहीं, एक संकुल सूचकांक उपयोगी हो सकता है, लेकिन यह समय लेने के लिए और आप इसके साथ क्या हासिल करने की कोशिश कर रहे हैं, इसका विश्लेषण करने के लिए एक अतिरिक्त प्रयास करें।
केएल ट्रिप लेख से उद्धृत
तो आपको क्या करना चाहिए? निर्भर करता है। यदि आप अपने डेटा को अच्छी तरह से जानते हैं और आप कुछ व्यापक परीक्षण करते हैं तो आप एक संकेत का उपयोग करने पर विचार कर सकते हैं (कुछ चतुर चीजें हैं जो आप प्रोग्राम में sps में कर सकते हैं, मैं कोशिश करूंगा और जल्द ही इस पर एक पोस्ट समर्पित करूंगा)। हालांकि, बहुत बेहतर विकल्प (यदि संभव हो तो) कवर करने पर विचार करना है (यह वास्तव में मेरा मुख्य बिंदु है :)। मेरे प्रश्नों में, कवर करना अवास्तविक है क्योंकि मेरे प्रश्न सभी कॉलम (बुराई का चयन *) चाहते हैं, लेकिन, यदि आपके प्रश्न संकीर्ण हैं और वे उच्च प्राथमिकता वाले हैं, तो आप एक संकेत पर (कई मामलों में) कवरिंग इंडेक्स के साथ बेहतर हैं क्योंकि एक सूचकांक जो एक क्वेरी को कवर करता है, कभी टिप्स नहीं।
यह अब के लिए पहेली का जवाब है, लेकिन इसमें निश्चित रूप से गोता लगाने के लिए बहुत कुछ है। टिपिंग प्वाइंट एक बहुत अच्छी बात हो सकती है - और यह आमतौर पर अच्छी तरह से काम करता है। लेकिन, यदि आप पा रहे हैं कि आप एक इंडेक्स को बाध्य कर सकते हैं और बेहतर प्रदर्शन प्राप्त कर सकते हैं तो आप कुछ जांच करना चाहते हैं और देखें कि क्या यह ऐसा है। फिर विचार करें कि संकेत देने में कितनी संभावना है और अब आप जानते हैं कि आप कहाँ ध्यान केंद्रित कर सकते हैं।