2011-01-02 12 views
6

पर कार्डिनलिटी स्विच करता है मानते हैं कि एक तालिका में इंडेक्स की तलाश करने के लिए पर्याप्त जानकारी होती है, एसक्यूएल सर्वर (या पोस्टग्रेएसक्यूएल) इंडेक्स स्कैन के लिए कौन सी कार्डिनालिटी चुनती है?एसक्यूएल सर्वर एक इंडेक्स स्कैन (बनाम तलाश)

कारण मैं यह पूछता हूं कि मैंने पहले एक प्रश्न (link) पोस्ट किया था जिसमें दो प्रश्न एक ही गति पर प्रदर्शन करते थे, फिर भी किसी ने संसाधित कॉलम पर इंडेक्स का उपयोग करने का प्रयास नहीं किया था। SQL सर्वर के सुझाव के बाद मैंने को इंडेक्स को कवर किया है जो शामिल हैं कॉलम पूछे जाने वाले कॉलम (यह दोनों प्रश्नों के लिए यह सुझाव दिया गया है), मैंने कारणों की तलाश शुरू कर दी कि यह इतना अजीब सुझाव क्यों देगा।

मैंने इंडेक्स को कवर और समग्र बनाने के साथ प्रयोग किया, लेकिन दोनों एक ही समय में निष्पादित किए गए (हम 3 मिलियन पंक्तियों की बात कर रहे हैं)।

अंत में मैंने निष्कर्ष निकाला कि यह डेटा की अति उच्च उच्चता के कारण था। हर पंक्ति अद्वितीय है। मैं एसक्यूएल सर्वर को इंडेक्स स्कैन चुनने के कारण इसे कम कर रहा हूं। हालांकि, प्रश्न "WHERE Col1>? और Col2 <" कहा गया है, "तो यह थोड़ा उलझन में है।

मेरे प्रश्न हैं:

  1. क्या प्रमुखता पर एक आरडीबीएमएस हमेशा एक सूचकांक स्कैन के लिए चुनते जाएगा?
  2. क्या कोई यह समझा सकता है कि SQL सर्वर इंडेक्स का उपयोग क्यों नहीं करेगा जब WHERE कथन इंगित करेगा कि यह समझ में आएगा?

मैंने निष्पादन योजना संलग्न की है। alt text

उत्तर

5

SQL सर्वर के संदर्भ में, इसे टिपिंग पॉइंट के रूप में जाना जाता है, जिसमें किम्बर्ले का ब्लॉग पोस्ट उस पर एक अच्छा पढ़ा जाता है। http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx

टिपिंग प्वाइंट तालिका के भीतर पृष्ठों की कुल संख्या का 25% -33% का दिशानिर्देश है, पंक्तियों के रूप में व्यक्त किया गया है, उदा। 10k डेटा पेज 2500-3333 पंक्तियों का एक टिपिंग प्वाइंट देंगे। दिशानिर्देशों के अनुसार यह बहुत अच्छा है, और जितना अच्छा होगा उतना अच्छा होगा - याद रखें कि क्वेरी प्लान इंजन एक ब्लैक बॉक्स है, और जब तक यह आपको एक प्रश्न योजना देगा, यह केवल यही कहता है कि उसने क्या फैसला किया, क्यों नहीं।

हालांकि कवरेज इंडेक्स को टिप करने के मामले में, यह वास्तव में बहुत आसान नहीं है, यहां तक ​​कि 100% डेटा को कवर करने वाले इंडेक्स का चयन करने के साथ ही अधिकांश मामलों में स्कैन की तलाश होगी।

यह समझ में आता है, अगर आप मानते हैं कि लागत अनुकूलक इंडेक्स पेज पदानुक्रम के लिए कोई वास्तविक लागत निर्दिष्ट नहीं करता है, तो किसी भी सूचकांक के पत्ते पृष्ठों तक पहुंच को केवल लागत ही लेता है। उस बिंदु पर, कवरिंग इंडेक्स के 100% स्कैनिंग या मांग की लागत समान होती है।

मुझे अपने स्वयं के प्रयोग (http://sqlfascination.com/2009/11/07/can-a-covering-nc-index-be-tipped) से मिला है, जो क्लॉज के बीच का उपयोग करके स्कैन करने का कारण बनता है, लेकिन अन्य जहां खंड नहीं होंगे - जो मैं कह सकता हूं उससे क्वेरी इंजन के माध्यम से मार्ग पर पूरी तरह से नीचे था।

+0

ग्रेट उत्तर @ एंड्रयू। यह मेरे लिए अच्छी तरह से साफ़ करता है, और बताता है कि क्यों SQL सर्वर ने इंडेक्स स्कैन करना चुना। – IamIC

+0

@ एंड्रयू: "हालांकि कवरेज इंडेक्स को टिप करने के मामले में, यह वास्तव में बहुत आसान नहीं है, यहां तक ​​कि 100% डेटा को कवर करने वाले इंडेक्स का चयन करने के साथ ही अधिकांश मामलों में स्कैन की तलाश होगी" - यह क्यों है? – IamIC

+0

क्वेरी प्लान इंजन एक लागत आधारित ऑप्टिमाइज़र है, इंडेक्स पदानुक्रम की पहुंच को इंडेक्स में प्रत्येक लीफ पेज की मांग करने के लिए 0 के रूप में खर्च किया जाता है, वही लागत इंडेक्स (लागत शर्तों में) में प्रत्येक लीफ पेज स्कैन करने की लागत होती है। जहां इस्तेमाल किए गए खंड के आधार पर मैंने देखा है कि यह दोनों करता है, लेकिन इसे स्कैन करने के लिए काफी प्रयास किए गए, डिफ़ॉल्ट – Andrew

3

पोस्टग्रेएसक्यूएल में, आमतौर पर यह पूछने के लिए एक अच्छा सवाल नहीं है क्योंकि वास्तविक योजना चयन अधिक जटिल है। यह टेबल आकार, मेमोरी सेटिंग्स, और क्वेरी के अन्य भागों पर निर्भर करता है। यदि आप बहुत कम पंक्तियों का चयन कर रहे हैं तो आपको आमतौर पर एक सादा इंडेक्स स्कैन मिलेगा। इसके अलावा, आपको बिटमैप इंडेक्स सरल प्रयोगों में 40% चुनिंदाता कहने के लिए स्कैन करेगा।

+0

धन्यवाद @ पीटर। आप बिटमैप इंडेक्स (एम/कैच से वंशज) का जिक्र करते हैं। किस स्थितियों के तहत उपयोग किया जाता है? (कम कार्डिनालिटी मैं अनुमान लगा रहा हूं) – IamIC

+0

Ps। मैं PostgreSQL के लिए नया हूँ, लेकिन एसक्यूएल सर्वर के साथ अनुभवी। – IamIC

+0

बिटमैप इंडेक्स स्कैन बिटमैप इंडेक्स का उपयोग नहीं करता है (जो PostgreSQL में मौजूद नहीं है)। यह एक तरह का इंडेक्स स्कैन है जो रास्ते में कुछ बिटमैप का उपयोग करता है। जैसा कि मैंने उपरोक्त लिखा है, वे नियमित सूचकांक स्कैन और अनुक्रमिक स्कैन के बीच कहीं भी उपयोग किए जाते हैं। –

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