हाँ, यह होगा।
OPTION(OPTIMIZE FOR UNKNOWN)
के बीच दो मुख्य अंतर हैं और OPTION(RECOMPILE)
जैसा कि इस उद्धरण से देखा जा सकता है MSDN
:
तो, दो मुख्य अंतर हैं:
- क्वेरी योजना का कैशिंग (या नहीं)।
आम तौर पर जेनरेट की गई क्वेरी योजना कैश की जाती है और पुन:उपयोग की जाती है। OPTIMIZE FOR UNKNOWN
इंजन की इस सुविधा को प्रभावित नहीं करता है। RECOMPILE
इस सुविधा को दबा देता है और इंजन को योजना को त्यागने और इसे कैशे में न डालने के लिए कहता है।
- योजना निर्माण के दौरान वास्तविक पैरामीटर मानों का उपयोग करना (या नहीं) करना।
आमतौर पर ऑप्टिमाइज़र पैरामीटर मानों को "सूँघता है" और योजना बनाते समय इन मानों का उपयोग करता है। OPTIMIZE FOR UNKNOWN
इस सुविधा को दबाता है और इंजन को सभी मापदंडों के साथ ऐसा व्यवहार करने के लिए कहता है जैसे कि उनके मान अज्ञात थे। ऑप्टिमाइज़र में अंतर्निहित नियम और अनुमान हैं कि विभिन्न फ़िल्टरिंग मानदंडों के लिए उपलब्ध आंकड़ों का उपयोग कैसे करें। देखें Optimize for… Mediocre?
अधिक जानकारी के लिए। आम तौर पर पैरामीटर सूँघने का उपयोग क्वेरी/संग्रहीत प्रक्रिया के पहले रन पर किया जाता है और पहले रन के दौरान मापदंडों के मूल्यों का उपयोग करता है। जेनरेट की गई योजना कैश की गई है और बाद में इसका पुन:उपयोग किया जा सकता है।
यहां याद रखने वाली एक गैर-स्पष्ट बात यह है कि दोनों ही मामलों में (बिना किसी क्वेरी संकेत के सामान्य और OPTIMIZE FOR UNKNOWN
के साथ) संकेत) जेनरेट की गई योजना को मान्य होना चाहिए और किसी भी . के लिए सही परिणाम देना चाहिए संभावित पैरामीटर मान यह सूँघने वाले मूल्यों के अनुरूप है जो सामान्य/नो-हिंट मामले में पहली बार चलाने के दौरान उपयोग किए गए थे; यह OPTIMIZE FOR UNKNOWN
में किसी विशिष्ट मान के अनुरूप नहीं है मामला, लेकिन यह अभी भी मान्य है यदि पैरामीटर बाद में किसी भी तरह से बदलता है।
यह महत्वपूर्ण है और यह अनुकूलक को योजना के कुछ परिवर्तन और सरलीकरण करने से रोकता है।
OPTION(RECOMPILE)
ऑप्टिमाइज़र को प्रत्येक रन के दौरान पैरामीटर के वास्तविक मानों को इनलाइन करने की अनुमति देता है और ऑप्टिमाइज़र बेहतर योजना बनाने के लिए पैरामीटर के वास्तविक मानों का उपयोग करता है। यह चिंता करने की ज़रूरत नहीं है कि उत्पन्न योजना पैरामीटर के किसी अन्य मान के साथ काम नहीं कर सकती है, क्योंकि योजना को कैश नहीं किया जाएगा और पुन:उपयोग नहीं किया जाएगा।
यह प्रभाव अधिकतर गतिशील खोज स्थितियों के लिए दिखाई देता है प्रश्न। उदाहरण के लिए:
SELECT ...
FROM T
WHERE
(@ParamSomeID = 0)
OR
(
@ParamSomeID = -1
AND
T.SomeID NOT IN
(
SELECT OtherTable.SomeID
FROM OtherTable
)
)
OR
(
T.SomeID IN
(
SELECT OtherTable.SomeID
FROM OtherTable
WHERE OtherTable.SomeID = @ParamSomeID
)
)
OPTION(RECOMPILE)
अगर @ParamSomeID
है 0
ऑप्टिमाइज़र क्वेरी को ऐसे मानेगा जैसे कि उसके पास कोई WHERE
नहीं है खंड बिल्कुल। योजना में OtherTable
. का उल्लेख नहीं होगा बिल्कुल भी।
अगर @ParamSomeID
-1
है , योजना T
. में शामिल होगी OtherTable
. के लिए लेफ्ट एंटी सेमी जॉइन का उपयोग करके और संपूर्ण OtherTable
को स्कैन करेगा .
अगर @ParamSomeID
है, कहते हैं, 5, योजना OtherTable
. पर अद्वितीय अनुक्रमणिका में अनुक्रमणिका खोज करेगी और OtherTable
. से केवल एक पंक्ति पढ़ें ।
बिना OPTION(RECOMPILE)
इस तरह का सरलीकरण और परिवर्तन नहीं होगा।
OPTION(RECOMPILE)
. का उपयोग करने का एक अन्य कारण तब होता है जब आपका डेटा वितरण बहुत विषम होता है। उदाहरण के लिए, आपके पास 1M पंक्तियों वाली एक तालिका है। एक कॉलम में 990K पंक्तियों में 0 और 1K पंक्तियों में 1 से 10 तक के मान होते हैं। इस कॉलम पर फ़िल्टर की जाने वाली क्वेरीज़ में फ़िल्टर के वास्तविक मूल्य के आधार पर अलग-अलग योजनाएँ होनी चाहिए।
ऊपर दिए गए दोनों उदाहरणों में OPTIMIZE FOR UNKNOWN
एक औसत योजना उत्पन्न करेगा।