मैं इस तरह एक प्रश्न है:कैसे मैं पहले सबक्वेरी निष्पादित और फिल्टर करने के लिए एसक्यूएल सर्वर मजबूर कर सकते हैं 'जहां' बयान
select * from (
select * from TableX
where col1 % 2 = 0
) subquery
where col1 % 4 = 0
वास्तविक सबक्वेरी अधिक जटिल है। जब मैं अकेले सबक्वायरी निष्पादित करता हूं तो यह जल्दी से 200rows देता है, लेकिन जब मैं पूरी क्वेरी निष्पादित करता हूं, तो प्रतीक्षा करने में बहुत लंबा समय लगता है।
मुझे पता है कि एसक्यूएल सर्वर यहां कुछ अनुकूलन लेता है और where
कथन को सबक्वायरी में विलय करता है, और नई निष्पादन योजना का उत्पादन करता है जो कि कुशल नहीं है। एल्थॉट मैं निष्पादन योजना में जा सकता हूं और विश्लेषण कर सकता हूं कि क्यों, इंडेक्स गायब होने की तरह, सांख्यिकी स्टेल।
लेकिन मुझे निश्चित रूप से पता है कि, मेरी सबक्वायरी जो बेसटेबल के रूप में कार्य करती है केवल डेटा का एक छोटा सा हिस्सा लौटाएगी, इसलिए मैं चाहता हूं कि सभी फ़िल्टरिंग या शामिल होने से डेटा के इन छोटे हिस्से में ही होगा।
मेरा सवाल है, क्या मैं बाहरी where
कथन के बारे में देखभाल किए बिना, पहले सबक्वायरी निष्पादित करने के लिए एसक्यूएल सर्वर को मजबूर कर सकता हूं? (Btw, TempTable मेरा आखिरी विकल्प है, CTE काम नहीं कर रहा)
अस्थायी तालिका का उपयोग करने के बारे में क्या? – fnurglewitz
वास्तविक समस्या की व्याख्या करने के बारे में क्या - बल न दें, लेकिन निष्पादन योजना की जांच करें और देखें कि क्यों SQL सर्वर सोचता है कि यह उस तरह से बेहतर है। क्या आप पूरी तरह से पैच हैं? कुछ मुद्दे क्वेरी ऑप्टिमाइज़र के साथ थे - अतीत में लंबे समय तक, लेकिन कुछ लोग अभी भी एसक्यूएल सर्वर 2005 का उपयोग करते हैं। – TomTom
@ टॉमटॉम ये भविष्यवाणियां अनुपयोगी हैं, इसलिए उम्मीद है कि ऑप्टिमाइज़र अनुमान बंद हो जाएंगे। यह आंकड़ों का उपयोग नहीं कर सकता है और केवल अनुमान लगाना होगा। शायद एक गणना कॉलम पर आंकड़े बनाने में मदद मिलेगी। –