(एसओ से सवाल किया गया)
मेरे पास एक तालिका (डमी डेटा) है जिसमें गुच्छेदार सूचकांक में 2 कॉलम हैं:
अब मैं उन दो प्रश्नों को चलाता हूं:
declare
@productid int =1 ,
@priceid int = 1
SELECT productid,
t.priceID
FROM Transactions AS t
WHERE (productID = @productid OR @productid IS NULL)
AND (priceid = @priceid OR @priceid IS NULL)
SELECT productid,
t.priceID
FROM Transactions AS t
WHERE (productID = @productid)
AND (priceid = @priceid)
दोनों प्रश्नों के लिए वास्तविक निष्पादन योजना है:
जैसा कि आप देख सकते हैं, पहला व्यक्ति SCAN का उपयोग कर रहा है जबकि दूसरा एक SEEK का उपयोग कर रहा है।
हालांकि - OPTION (RECOMPILE)
पहली क्वेरी में जोड़कर , SEEK का उपयोग करने के लिए निष्पादन योजना भी बनाई:
DBA चैट पर दोस्तों ने मुझे बताया कि:
आपकी क्वेरी में, @ productid = 1, जिसका अर्थ है कि (productID = @ productID या @productID IS NULL) को (productID = @ productID) सरल बनाया जा सकता है। पूर्व में @productID के किसी भी मूल्य के साथ काम करने के लिए एक स्कैन की आवश्यकता होती है, बाद वाला एक तलाश का उपयोग कर सकता है। इसलिए, जब आप RECOMPILE का उपयोग करते हैं, तो SQL सर्वर आपको वास्तव में @productID में किस मूल्य पर दिखेगा और इसके लिए सबसे अच्छी योजना बनाता है। @ProductID में एक गैर-शून्य मान के साथ, एक तलाश सबसे अच्छा है। यदि @productID का मान अज्ञात है, तो योजना को @productID में किसी भी संभावित मान के अनुरूप होना चाहिए, जिसके लिए स्कैन की आवश्यकता होगी। सावधान रहें: विकल्प (रीकैपाइल) हर बार जब आप इसे चलाते हैं, तो योजना की एक पुनरावृत्ति होगी, जो हर निष्पादन में कुछ मिलीसेकंड जोड़ देगा। हालांकि यह केवल एक समस्या है अगर क्वेरी बहुत बार चलती है।
इसके अलावा:
यदि @productID शून्य है, तो आप किस मूल्य की तलाश करेंगे? उत्तर: तलाश करने के लिए कुछ भी नहीं है। सभी मूल्य अर्हता प्राप्त करते हैं।
मैं समझता हूं कि OPTION (RECOMPILE)
एसक्यूएल सर्वर को यह देखने के लिए मजबूर करता है कि मापदंडों में क्या वास्तविक मूल्य हैं, और देखें कि क्या यह इसके साथ जुड़ सकता है।
लेकिन अब मैं आगे-संकलन का लाभ खो देता हूं।
सवाल
IMHO - SCAN केवल तभी होगा जब एक परम शून्य है।
यह ठीक है - SQL सर्वर को SCAN के लिए एक निष्पादन योजना बनाने दें।
लेकिन अगर SQL सर्वर देखता है कि मैं इस क्वेरी को मानों के साथ कई बार चलाता हूं: 1,1
तो वह ANOTHER निष्पादन योजना क्यों नहीं बनाता है और उसके लिए SEEK का उपयोग करता है?
AFAIK - SQL सबसे हिट प्रश्नों के लिए निष्पादन योजना बनाता है ।
SQL SERVER के लिए निष्पादन योजना क्यों नहीं बचाती है:
@productid int =1 , @priceid int = 1
(मैं इसे उन मूल्यों के साथ कई बार चलाता हूं)
- क्या SQL को उस निष्पादन योजना (जो SEEK का उपयोग करता है) को भविष्य के आह्वान के लिए रखने के लिए मजबूर करना संभव है?