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

ORDER BY की परवाह किए बिना, SELECT TOP धीमा है

और इसलिए शुरू होता है "ऑप्टिमाइज़र को बेहतर बनाने की कोशिश करना (क्योंकि यह हमेशा सबसे अच्छा नहीं जानता)" का दुर्भाग्यपूर्ण खेल शुरू होता है।

आप फ़िल्टरिंग भागों को एक सबक्वेरी या सीटीई में डालने का प्रयास कर सकते हैं:

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 अस्थायी तालिका से।




  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. SQL सर्वर में &ऑपरेटर का उपयोग क्या है?

  4. तालिका नामकरण दुविधा:एकवचन बनाम बहुवचन नाम

  5. SQL सर्वर 2005:पूर्ण टेक्स्ट कैटलॉग के साथ sp_attach_db का उपयोग करके डेटाबेस संलग्न करें