तीन साल पहले, मैंने खराब कार्डिनैलिटी अनुमानों के बारे में प्लान एक्सप्लोरर को एक फिक्स के बारे में पोस्ट किया था कि SQL सर्वर का शोप्लान एक्सएमएल उत्पादन कर रहा था, एसक्यूएल सर्वर 2008 और उससे ऊपर के फ़िल्टर के साथ कुंजी/आरआईडी लुकअप के मामले में। मैंने सोचा था कि इन योजनाओं में से एक के बारे में पीछे मुड़कर देखना और थोड़ा और विस्तार से जाना दिलचस्प होगा और यह सुनिश्चित करने के लिए कि हम सही मेट्रिक्स प्रदर्शित कर रहे थे, प्रबंधन स्टूडियो जो भी दिखाता है, उसकी परवाह किए बिना। फिर से, यह काम बड़े पैमाने पर ब्रुक फिल्पोट (@MacroMullet) और ग्रेग गोंजालेज (@SQLsensei) द्वारा और पॉल व्हाइट (@SQL_Kiwi) के महान इनपुट के साथ किया गया था।
यह काफी हद तक उस प्रश्न के समान है जो मैंने अपनी पिछली पोस्ट में प्रस्तुत किया था, जो पॉल से आया था (और जो एडवेंचरवर्क्स के आधुनिक संस्करणों में बिल्कुल पुन:पेश करने के लिए कुछ काम करेगा, जहां कम से कम लेनदेन की तारीखें बदल गई हैं):
SELECT th.ProductID, p.Name, th.TransactionID, th.TransactionDate FROM Production.Product AS p JOIN Production.TransactionHistory AS th ON th.ProductID = p.ProductID WHERE p.ProductID IN (1, 2) AND th.TransactionDate BETWEEN '20070901' AND '20071231';
प्रबंधन स्टूडियो की योजना काफी सही लग रही थी:
हालाँकि, यदि आप करीब से देखते हैं, तो ऐसा लगता है कि शोप्लान ने निष्पादन की अनुमानित संख्या को कुंजी लुकअप से सीधे अंतिम एक्सचेंज के लिए पंक्तियों की अनुमानित संख्या तक धकेल दिया है:
पहली नज़र में, प्लान एक्सप्लोरर में ग्राफिकल प्लान डायग्राम SSMS द्वारा तैयार की गई योजना के समान दिखता है:
अब, प्लान एक्सप्लोरर को विकसित करने की प्रक्रिया में, हमने कई मामलों की खोज की है जहां शोप्लान अपने गणित को बिल्कुल सही नहीं पाता है। सबसे स्पष्ट उदाहरण प्रतिशत है जो 100% से अधिक है; हमें यह अधिकार उन मामलों में मिलता है जहां SSMS हास्यास्पद रूप से बंद है (मैं इसे आज की तुलना में कम बार देखता हूं, लेकिन यह अभी भी होता है)।
एक और मामला यह है कि, SQL सर्वर 2008 में शुरू होने पर, SSMS ने लुकअप के साथ-साथ प्रति निष्पादन पंक्तियों के बजाय कुल अनुमानित पंक्तियों को डालना शुरू कर दिया, लेकिन केवल उन मामलों में जहां एक विधेय को लुकअप में धकेला जाता है (जैसे कि पॉल द्वारा रिपोर्ट किए गए इस बग में मामला, और जॉय डी'एंटोनी द्वारा यह हालिया अवलोकन)। SQL सर्वर के पुराने संस्करणों में (और फ़ंक्शंस और स्पूल के साथ), हम आम तौर पर SSMS के अनुसार पंक्तियों की अनुमानित संख्या से अनुमानित पंक्तियों को प्रति निष्पादन (आमतौर पर 1) से गुणा करके एक लुकअप से आने वाली अनुमानित पंक्ति गणना दिखाएंगे। लेकिन इस बदलाव के साथ, हम अति-गिनती करेंगे, क्योंकि ऑपरेटर अब पहले से ही वह गणित कर रहा है। इसलिए, प्लान एक्सप्लोरर के पुराने संस्करणों में, 2008+ के मुकाबले, आपको ये विवरण टूलटिप्स, कनेक्टर लाइनों या विभिन्न ग्रिडों में दिखाई देंगे:
(1,721 कहाँ से आते हैं? 67.5 अनुमानित निष्पादन x 25.4927 अनुमानित पंक्तियाँ।)
2012 में वापस, हमने इस गणितीय ऑपरेशन को अब और नहीं करके, और मुख्य लुकअप से आने वाली अनुमानित पंक्ति गणनाओं पर पूरी तरह भरोसा करके इस मुद्दे का एक हिस्सा तय किया। यह लगभग सही था, लेकिन हम अभी भी अनुमानित पंक्ति गणना पर भरोसा कर रहे थे शोप्लान हमें अंतिम विनिमय के लिए प्रदान कर रहा था:
हमने इस मुद्दे को संस्करण 7.2.42.0 (हैलोवेन 2012 पर जारी) में भी जल्दी से संबोधित किया, और अब हमें लगता है कि हम प्रबंधन स्टूडियो की तुलना में अधिक सटीक जानकारी प्रदान कर रहे हैं (हालांकि हम पॉल से इस बग पर नजर रखेंगे) :
यह स्पष्ट रूप से बहुत समय पहले हुआ था, लेकिन मुझे अभी भी लगा कि इसे साझा करना दिलचस्प होगा। हम आपको यथासंभव सटीक जानकारी प्रदान करने के लिए प्लान एक्सप्लोरर में सुधार करना जारी रखते हैं, और मैं आगामी पोस्टों में इनमें से कुछ और नगेट्स साझा करूंगा।