जब आप " एड हॉक वर्कलोड के लिए ऑप्टिमाइज़ करें " विकल्प को चालू करते हैं, तो आप एड-हॉक क्वेरी का कारण बनेंगे जो कि 2 बार चलाए जाते हैं 1 के समान धीमी गति से, क्योंकि आप एक निष्पादन योजना का संकलन करेंगे और उसी डेटा को खींचेंगे इसके बिना कैश) उन पहले 2 बार।
यह एक बड़ी बात नहीं हो सकती है, लेकिन प्रश्नों का परीक्षण करते समय आप इसे नोटिस करेंगे।
तो अब क्या होता है, इस विकल्प के बिना और 1-ऑफ एड-हॉक प्रश्नों से भरा कैश?
कैशिंग प्रबंधन एल्गोरिथम:
जैसा कि इस अनुकूलन सुविधा को पेश किया गया था, कैशिंग प्रबंधन एल्गोरिथ्म भी अपडेट किया गया था।
किम्बर्ली ट्रिप के लेख में इस एल्गोरिथ्म परिवर्तन के बारे में कालेन डेलाने की पोस्ट का भी उल्लेख है ।
वह इसे सबसे अच्छा समझाती है:
परिवर्तन वास्तव में एक योजना कैश आकार की गणना करता है जिस पर SQL सर्वर मानता है कि स्मृति दबाव है, और यह कैश से योजनाओं को निकालना शुरू कर देगा। हटाए जाने की योजनाएं सस्ती योजनाएं हैं जिनका पुन: उपयोग नहीं किया गया है, और यह एक अच्छी बात है।
इसका मतलब यह है कि उन pesky एक-टाइमर योजनाओं को जाने के लिए सबसे पहले होगा जब आपको संसाधनों को खाली करने की आवश्यकता होगी।
तो अब सवाल यह है कि:
" जब आवश्यक हो तो SQL सर्वर अप्रयुक्त योजनाओं को हटाने का ख्याल रखते हुए " हमें एड हॉक वर्कलोड के लिए ऑप्टिमाइज़ क्यों करना चाहिए? "
मेरा जवाब है, यदि आपके पास नियमित रूप से गैर-पैरामीटर वाले विज्ञापन के गतिशील-एसक्यूएल उत्पादक oodles का एक टन है।" -जब सवाल है, तो यह इस सुविधा को चालू करने के लिए सही समझ में आता है।
आप सिस्टम संसाधनों पर एक दबाव बनाने से बचना चाहते हैं, जैसे कि यह कैश्ड-प्लान / डेटा हटाने के लिए मजबूर करता है क्योंकि आपने अधिकतम कैश मेमोरी स्पेस का उपयोग किया है।
मुझे कैसे पता चलेगा कि मुझे इसे चालू करने की आवश्यकता है?
यहाँ एक प्रश्न है जो मैंने आपको यह दिखाने के लिए लिखा है कि आपने वर्तमान में कितने विज्ञापन-हॉक योजनाएँ कैश की हैं और वे कितनी डिस्क-स्पेस खा रहे हैं (परिणाम पूरे दिन में बदल जाएंगे - इसलिए भारी समय के दौरान इसका परीक्षण करें):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
परिणाम:
मैं यह कहने वाला नहीं हूं, " जब आपके पास X MB है " या " यदि आपके Ad Hoc का X% सिंगल-यूज़ है " तो इसे चालू करें।
यह Sprocs, ट्रिगर, दृश्य या परिमाणित / तैयार SQL - सिर्फ Ad-Hoc क्वेरी को प्रभावित नहीं करता है।
मेरी व्यक्तिगत सिफारिश है कि आप केवल अपने पर्यावरण वातावरण को चालू करें, लेकिन अपने देव पर्यावरण में इसे छोड़ने पर विचार करें।
मैं यह केवल देव के लिए कहता हूं , क्योंकि यदि आप एक ऐसी क्वेरी का अनुकूलन कर रहे हैं, जिसे चलाने में एक मिनट या उससे अधिक समय लगता है, तो आप इसे 3 बार चलाना नहीं चाहते हैं, इससे पहले कि आप देख सकते हैं कि यह कितनी तेजी से बंद हो जाएगा - हर एक ही बार जब आप इसे सबसे अच्छा अनुकूलन डिजाइन खोजने के लिए संपादित करते हैं।
यदि आपका काम पूरे दिन ऐसा करना शामिल नहीं करता है, तो पागल हो जाएं और अपने डीबीए को इसे हर जगह चालू करने के लिए कहें।