Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

यह इंडेक्स स्कैन क्यों है और इंडेक्स सीक क्यों नहीं है?

यह मुख्य रूप से इंडेक्स स्कैन का उपयोग कर रहा है क्योंकि यह मर्ज जॉइन का भी उपयोग कर रहा है। मर्ज जॉइन ऑपरेटर को दो इनपुट स्ट्रीम की आवश्यकता होती है जो दोनों को एक क्रम में क्रमबद्ध किया जाता है जो कि जॉइन शर्तों के अनुकूल है।

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

नकारात्मक पक्ष यह है कि आपने क्या देखा है:ऐसा लगता है कि यह पूरी अनुक्रमणिका को स्कैन कर रहा है, तो यह कैसे तेज़ हो सकता है यदि यह इतने सारे रिकॉर्ड पढ़ रहा है जिसका उपयोग कभी नहीं किया जा सकता है? इसका उत्तर यह है कि स्कैन (उनकी अनुक्रमिक प्रकृति के कारण) कहीं भी 10 से 100 गुना अधिक रिकॉर्ड/सेकंड के रूप में कहीं भी पढ़ सकते हैं।

अब सीक्स आमतौर पर जीतते हैं क्योंकि वे चयनात्मक होते हैं:उन्हें केवल वे पंक्तियाँ मिलती हैं जो आप माँगते हैं, जबकि स्कैन गैर-चयनात्मक होते हैं:उन्हें सीमा में प्रत्येक पंक्ति को वापस करना होगा। लेकिन क्योंकि स्कैन में बहुत होता है उच्च पढ़ने की दर, वे अक्सर सीक्स को तब तक हरा सकते हैं जब तक कि छोड़ी गई पंक्तियों और मिलान पंक्तियों का अनुपात निचला है स्कैन पंक्तियों/सेकंड वी.एस. के अनुपात से। पंक्तियों/सेकंड की तलाश करें।

प्रश्न?

ठीक है, मुझे अंतिम वाक्य को और समझाने के लिए कहा गया है:

एक "छोड़ी गई पंक्ति" वह है जिसे स्कैन पढ़ता है (क्योंकि इसे इंडेक्स में सब कुछ पढ़ना है), लेकिन इसे मर्ज जॉइन ऑपरेटर द्वारा अस्वीकार कर दिया जाएगा, क्योंकि इसका दूसरी तरफ कोई मेल नहीं है, संभवतः क्योंकि जहां क्लॉज कंडीशन ने इसे पहले ही बाहर कर दिया है।

"मिलान करने वाली पंक्तियां" वे हैं जिन्हें यह पढ़ता है जो वास्तव में मर्ज जॉइन में किसी चीज़ से मेल खाते हैं। ये वही पंक्तियाँ हैं जिन्हें एक सीक द्वारा पढ़ा गया होता यदि स्कैन को सीक द्वारा बदल दिया जाता।

आप क्वेरी प्लान में आँकड़ों को देखकर पता लगा सकते हैं कि क्या हैं। इंडेक्स स्कैन के बाईं ओर वह विशाल मोटा तीर देखें? यह दर्शाता है कि ऑप्टिमाइज़र कितनी पंक्तियों को सोचता है कि वह स्कैन के साथ पढ़ेगा। आपके द्वारा पोस्ट किए गए इंडेक्स स्कैन के आंकड़े बॉक्स से पता चलता है कि वास्तविक पंक्तियाँ लगभग 5.4M (5,394,402) हैं। यह इसके बराबर है:

TotalScanRows = (MatchingRows + DiscardedRows)

(मेरी शर्तों में, वैसे भी)। मिलान करने वाली पंक्तियाँ प्राप्त करने के लिए, मर्ज ज्वाइन ऑपरेटर द्वारा रिपोर्ट की गई "वास्तविक पंक्तियों" को देखें (इसे सटीक रूप से प्राप्त करने के लिए आपको शीर्ष 100 को हटाना पड़ सकता है)। एक बार जब आप यह जान लेते हैं, तो आप निम्न द्वारा छोड़ी गई पंक्तियों को प्राप्त कर सकते हैं:

DiscardedRows = (TotalScanRows - MatchingRows)

और अब आप अनुपात की गणना कर सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक डेटाबेस से दूसरे डेटाबेस में डेटा ट्रांसफर करें

  2. मौजूदा SQL सर्वर एजेंट जॉब (T-SQL) में जॉब स्टेप जोड़ें

  3. क्या UNION ALL परिणाम सेट के क्रम की गारंटी देता है

  4. एसएसआईएस विभाजक द्वारा स्ट्रिंग का हिस्सा कैसे प्राप्त करें

  5. कैसे एसक्यूएल चयन में कुछ मूल्यों के साथ रिकॉर्ड को बाहर करने के लिए?