मैं एक बहुत जटिल संग्रहित प्रक्रिया को डीबग करने की कोशिश कर रहा हूं जो कई टैबलेट (10-11) में शामिल हो जाता है। मैं देख रहा हूं कि पेड़ के एक हिस्से के लिए पंक्तियों की अनुमानित संख्या पंक्तियों की वास्तविक संख्या से काफी अलग है - इसके सबसे खराब SQL सर्वर का अनुमान है कि 1 पंक्ति वापस आ जाएगी, जब वास्तविकता में 55,000 पंक्तियां वापस आती हैं!एसक्यूएल सर्वर पंक्तियों की अनुमानित संख्या कैसे काम करता है?
मैं यह काम करने की कोशिश कर रहा हूं कि यह क्यों है - मेरे सभी आंकड़े अद्यतित हैं, और मैंने कई तालिकाओं पर एक पूर्णस्कैन के साथ आंकड़े अपडेट किए हैं। मैं किसी भी उपयोगकर्ता परिभाषित कार्यों या तालिका चर का उपयोग नहीं कर रहा हूँ। जहां तक मैं देख सकता हूं कि SQL सर्वर वास्तव में अनुमान लगा सकता है कि कितनी पंक्तियां वापस आने जा रही हैं, लेकिन यह एक ऐसी योजना चुनना जारी रखती है जो हजारों आरडीआई लुकअप करने के लिए करती है (जब यह केवल 1 प्रदर्शन करने की अपेक्षा करता है या 2)।
मैं कोशिश करने और समझने के लिए क्या कर सकता हूं कि पंक्तियों की अनुमानित संख्या इतनी अधिक क्यों है?
अद्यतन: तो योजना मैं विशेष रूप से एक नोड पाया है जो suspicous लगता है पर देख रहे हैं - अपनी एक मेज निम्नलिखित predecate का उपयोग कर एक मेज पर स्कैन:
status <> 5
AND [type] = 1
OR [type] = 2
यह विधेय पूरे तालिका लौटाता है (630 पंक्तियां - तालिका स्वयं को खराब प्रदर्शन का स्रोत नहीं स्कैन करती है) हालांकि SQL सर्वर की अनुमानित संख्या पंक्तियों की संख्या 37 है। SQL सर्वर तब आरडीआई लुकअप, इंडेक्स स्कैन और इंडेक्स पर इसके साथ कई नेस्टेड लूप करने जा रहा है। प्रयास है। क्या यह मेरे बड़े पैमाने पर गलत अनुमान का स्रोत हो सकता है? पंक्तियों की एक और समझदार संख्या का अनुमान लगाने के लिए मैं इसे कैसे प्राप्त करूं?
आप पोस्ट कृपया सकते हैं अपनी मेज परिभाषा और पूर्ण क्वेरी को हल कर सकते हैं? – Quassnoi
क्षमा करें, लेकिन वास्तव में नहीं - यह बहुत बड़ा है (250 लाइन एसपी + 10 टेबल)। – Justin
यदि आपका भविष्य बिल्कुल ठीक है (कोई ब्रैकेट नहीं) तो आपके पास तर्क समस्या हो सकती है। और ओआर पर प्राथमिकता लेता है। होना चाहिए [स्थिति] <> 5 और (टाइप = 1 या टाइप = 2) – GilaMonster