और इसलिए शुरू होता है "ऑप्टिमाइज़र को बेहतर बनाने की कोशिश करना (क्योंकि यह हमेशा सबसे अच्छा नहीं जानता)" का दुर्भाग्यपूर्ण खेल शुरू होता है।
आप फ़िल्टरिंग भागों को एक सबक्वेरी या सीटीई में डालने का प्रयास कर सकते हैं:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
जो इसे पहले फ़िल्टर करने के लिए मजबूर करने के लिए पर्याप्त हो सकता है (लेकिन ऑप्टिमाइज़र प्रत्येक रिलीज के साथ "स्मार्ट" हो जाता है, और कभी-कभी ऐसे शेंगेनियों के माध्यम से देख सकता है)। या आपको इस कोड को UDFमें डालने तक जाना पड़ सकता है। ए> . यदि आप UDF को एक मल्टीस्टेटमेंट तालिका-मूल्यवान फ़ंक्शन के रूप में लिखते हैं, जिसमें फ़िल्टरिंग अंदर है, और फिर उस UDF को अपने TOP x
से क्वेरी करें /ORDER BY
, आपने क्वेरी ऑर्डर को बहुत अच्छी तरह से मजबूर कर दिया है (क्योंकि SQL सर्वर वर्तमान में मल्टीस्टेटमेंट यूडीएफ के आसपास अनुकूलित करने में असमर्थ है)।
बेशक, इसके बारे में सोचना, यूडीएफ को पेश करना हम वास्तव में क्या कर रहे हैं इसे छिपाने का एक तरीका है - एक अस्थायी तालिका बनाएं, इसे पॉप्युलेट करने के लिए एक क्वेरी का उपयोग करें (WHERE फ़िल्टर के आधार पर), फिर TOP x
अस्थायी तालिका से।