पर कार्डिनलिटी स्विच करता है मानते हैं कि एक तालिका में इंडेक्स की तलाश करने के लिए पर्याप्त जानकारी होती है, एसक्यूएल सर्वर (या पोस्टग्रेएसक्यूएल) इंडेक्स स्कैन के लिए कौन सी कार्डिनालिटी चुनती है?एसक्यूएल सर्वर एक इंडेक्स स्कैन (बनाम तलाश)
कारण मैं यह पूछता हूं कि मैंने पहले एक प्रश्न (link) पोस्ट किया था जिसमें दो प्रश्न एक ही गति पर प्रदर्शन करते थे, फिर भी किसी ने संसाधित कॉलम पर इंडेक्स का उपयोग करने का प्रयास नहीं किया था। SQL सर्वर के सुझाव के बाद मैंने को इंडेक्स को कवर किया है जो शामिल हैं कॉलम पूछे जाने वाले कॉलम (यह दोनों प्रश्नों के लिए यह सुझाव दिया गया है), मैंने कारणों की तलाश शुरू कर दी कि यह इतना अजीब सुझाव क्यों देगा।
मैंने इंडेक्स को कवर और समग्र बनाने के साथ प्रयोग किया, लेकिन दोनों एक ही समय में निष्पादित किए गए (हम 3 मिलियन पंक्तियों की बात कर रहे हैं)।
अंत में मैंने निष्कर्ष निकाला कि यह डेटा की अति उच्च उच्चता के कारण था। हर पंक्ति अद्वितीय है। मैं एसक्यूएल सर्वर को इंडेक्स स्कैन चुनने के कारण इसे कम कर रहा हूं। हालांकि, प्रश्न "WHERE Col1>? और Col2 <" कहा गया है, "तो यह थोड़ा उलझन में है।
मेरे प्रश्न हैं:
- क्या प्रमुखता पर एक आरडीबीएमएस हमेशा एक सूचकांक स्कैन के लिए चुनते जाएगा?
- क्या कोई यह समझा सकता है कि SQL सर्वर इंडेक्स का उपयोग क्यों नहीं करेगा जब WHERE कथन इंगित करेगा कि यह समझ में आएगा?
मैंने निष्पादन योजना संलग्न की है।
ग्रेट उत्तर @ एंड्रयू। यह मेरे लिए अच्छी तरह से साफ़ करता है, और बताता है कि क्यों SQL सर्वर ने इंडेक्स स्कैन करना चुना। – IamIC
@ एंड्रयू: "हालांकि कवरेज इंडेक्स को टिप करने के मामले में, यह वास्तव में बहुत आसान नहीं है, यहां तक कि 100% डेटा को कवर करने वाले इंडेक्स का चयन करने के साथ ही अधिकांश मामलों में स्कैन की तलाश होगी" - यह क्यों है? – IamIC
क्वेरी प्लान इंजन एक लागत आधारित ऑप्टिमाइज़र है, इंडेक्स पदानुक्रम की पहुंच को इंडेक्स में प्रत्येक लीफ पेज की मांग करने के लिए 0 के रूप में खर्च किया जाता है, वही लागत इंडेक्स (लागत शर्तों में) में प्रत्येक लीफ पेज स्कैन करने की लागत होती है। जहां इस्तेमाल किए गए खंड के आधार पर मैंने देखा है कि यह दोनों करता है, लेकिन इसे स्कैन करने के लिए काफी प्रयास किए गए, डिफ़ॉल्ट – Andrew