मैं SQL सर्वर विकल्प "तदर्थ वर्कलोड के लिए अनुकूलन" का उपयोग क्यों नहीं करूंगा?


49

मैं किम्बर्ली ट्रिप द्वारा SQL सर्वर प्लान कैशिंग के बारे में कुछ महान लेख पढ़ रहा हूं जैसे कि यह एक: http://www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/

"तदर्थ वर्कलोड के लिए अनुकूलन" करने का विकल्प भी क्यों है? यह हमेशा नहीं होना चाहिए? डेवलपर्स एड-हॉक एसक्यूएल का उपयोग कर रहे हैं या नहीं, आपके पास यह विकल्प क्यों नहीं होगा जो इसे (एसक्यूएल 2008+) का समर्थन करने वाले हर उदाहरण पर सक्षम बनाता है, जिससे कैश ब्लोट को कम किया जा सकता है?

जवाबों:


45

SQL सर्वर विकास टीम कम से कम आश्चर्य के सिद्धांत पर काम करती है - इसलिए SQL सर्वर में आम तौर पर व्यवहार को बनाए रखने के हितों में पिछले संस्करणों के रूप में नई सुविधाएँ अक्षम होती हैं।

हाँ, एडहॉक वर्कलोड के लिए ऑप्टिमाइज़ करना प्लान कैश ब्लोट को कम करने में बहुत अच्छा है - लेकिन हमेशा इसे पहले टेस्ट करें!

[संपादित करें: केलेन डेलाने एक दिलचस्प किस्सा बताता है कि उसने अपने एक माइक्रोसॉफ्ट इंजीनियर दोस्त से पूछा कि क्या ऐसे हालात होंगे जहां इसे सक्षम करना उचित नहीं होगा। वह कहने के लिए कई दिनों के बाद वापस आता है - एक ऐसे आवेदन की कल्पना करें जिसमें विभिन्न प्रश्नों का एक बहुत कुछ है, और प्रत्येक क्वेरी कुल मिलाकर दो बार चलती है। तब यह अनुचित हो सकता है। कहने के लिए पर्याप्त नहीं है कि इस तरह के कई ऐप हैं!]

[संपादित करें: यदि आपके प्रश्नों के बहुमत को एक से अधिक बार निष्पादित किया जाता है (बिल्कुल दो बार नहीं); यह संभवतः अनुचित होगा। सामान्य नियम इसे चालू करने के लिए होगा यदि डेटाबेस पर कई एक बार उपयोग किए जाने वाले एडहॉक प्रश्न हैं; हालाँकि, अभी भी ऐसे कई ऐप नहीं हैं।]


9
+1 नई सुविधाएँ बहुत कम हैं, बहुत कम ही डिफ़ॉल्ट रूप से चालू होती हैं। मैं वास्तव में इस विशिष्ट विशेषता को चालू नहीं करने के लिए किसी भी अच्छे कारणों के बारे में नहीं सोच सकता हूं - सबसे खराब स्थिति में आपके सभी प्रश्न एकल-उपयोग हैं और वैसे भी कैशिंग से लाभ नहीं होगा।
हारून बर्ट्रेंड

1
यह सामान्य ज्ञान पर आधारित एक "सुरक्षित" उत्तर है और प्रश्न को संबोधित नहीं करता है। यह सुविधा बेहतर नहीं है, इसके लिए पूछने वाला विशेष रूप से उपयोग के मामले को जानना चाहता है।
माइकेटेवी

2
माइकटेवी - यह एक सुरक्षित उत्तर हो सकता है, लेकिन यह उन विशेषताओं में से एक है जहां मैं वास्तव में इसे सक्षम नहीं करने के कारण के बारे में नहीं सोच सकता। चूंकि यह बहुत भयानक है, मैं बस यह समझाना चाहता था कि यह डिफ़ॉल्ट रूप से बंद क्यों था!
पीटर स्कोफील्ड

21

नीचे एक छोटा कोड है जो आपको यह तय करने में मदद करेगा कि " एड हॉक वर्कलोड ऑन / ऑफ के लिए ऑप्टिमाइज़िंग ऑप्टिमाइज़ करना फायदेमंद होगा या नहीं"। हम आम तौर पर इन-हाउस और क्लाइंट सर्वर के लिए हमारी स्वास्थ्य जांच के एक हिस्से के रूप में इसकी जांच करते हैं।

यह सक्षम करने के लिए सबसे सुरक्षित विकल्प है और यहां ब्रैड द्वारा और ग्लेन बेरी द्वारा अच्छी तरह से वर्णन किया गया है

--- for 2008 and up .. Optimize ad-hoc for workload 
IF EXISTS (
        -- this is for 2008 and up
        SELECT 1
        FROM sys.configurations
        WHERE NAME = 'optimize for ad hoc workloads'
        )
BEGIN
    DECLARE @AdHocSizeInMB DECIMAL(14, 2)
        ,@TotalSizeInMB DECIMAL(14, 2)
        ,@ObjType NVARCHAR(34)

    SELECT @AdHocSizeInMB = SUM(CAST((
                    CASE 
                        WHEN usecounts = 1
                            AND LOWER(objtype) = 'adhoc'
                            THEN size_in_bytes
                        ELSE 0
                        END
                    ) AS DECIMAL(14, 2))) / 1048576
        ,@TotalSizeInMB = SUM(CAST(size_in_bytes AS DECIMAL(14, 2))) / 1048576
    FROM sys.dm_exec_cached_plans

    SELECT 'SQL Server Configuration' AS GROUP_TYPE
        ,' Total cache plan size (MB): ' + cast(@TotalSizeInMB AS VARCHAR(max)) + '. Current memory occupied by adhoc plans only used once (MB):' + cast(@AdHocSizeInMB AS VARCHAR(max)) + '.  Percentage of total cache plan occupied by adhoc plans only used once :' + cast(CAST((@AdHocSizeInMB / @TotalSizeInMB) * 100 AS DECIMAL(14, 2)) AS VARCHAR(max)) + '%' + ' ' AS COMMENTS
        ,' ' + CASE 
            WHEN @AdHocSizeInMB > 200
                OR ((@AdHocSizeInMB / @TotalSizeInMB) * 100) > 25 -- 200MB or > 25%
                THEN 'Switch on Optimize for ad hoc workloads as it will make a significant difference. Ref: http://sqlserverperformance.idera.com/memory/optimize-ad-hoc-workloads-option-sql-server-2008/. http://www.sqlskills.com/blogs/kimberly/post/procedure-cache-and-optimizing-for-adhoc-workloads.aspx'
            ELSE 'Setting Optimize for ad hoc workloads will make little difference !!'
            END + ' ' AS RECOMMENDATIONS
END

7

एक उत्पादन सर्वर के बारे में सोचें जो केवल 5 अलग-अलग प्रश्नों को प्रस्तुत करता है, लेकिन प्रति सेकंड कई हजार। आप Microsoft SQL सर्वर विकास टीम हैं। आप योजना कैशिंग के साथ बेला जा रहे हैं। क्या आप इस व्यवहार को डिफ़ॉल्ट रूप से चालू करते हैं, जब आप जानते हैं कि आपके कुछ सबसे बड़े और सबसे महत्वपूर्ण ग्राहक (जैसे, माइक्रोसॉफ्ट के आंतरिक एसएपी कार्यान्वयन) एक ही परिसर में काम करते हैं और उसी कैफेटेरिया का उपयोग करते हैं जो आप करते हैं?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट

7

जब आप " एड हॉक वर्कलोड के लिए ऑप्टिमाइज़ करें " विकल्प को चालू करते हैं, तो आप एड-हॉक क्वेरी का कारण बनेंगे जो कि 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 बार चलाना नहीं चाहते हैं, इससे पहले कि आप देख सकते हैं कि यह कितनी तेजी से बंद हो जाएगा - हर एक ही बार जब आप इसे सबसे अच्छा अनुकूलन डिजाइन खोजने के लिए संपादित करते हैं।
यदि आपका काम पूरे दिन ऐसा करना शामिल नहीं करता है, तो पागल हो जाएं और अपने डीबीए को इसे हर जगह चालू करने के लिए कहें।


0

"मुझे उपयोग क्यों नहीं करना चाहिए ...." कुछ प्रदर्शन जांच के दौरान, योजना का उपयोग वास्तविक समय के पास योजना कैश से बाहर निकालना, जबकि संसाधन उपयोग का अवलोकन करना बहुत सहायक हो सकता है। "एडहॉक वर्कलोड के लिए ऑप्टिमाइज़ करें" बाधित हो सकता है, क्योंकि एडहॉक स्टब प्लान कैश को क्वेरी करते समय एक योजना वापस नहीं करेगा। ऐसे मामले में, यदि क्वेरी और योजना को अन्यथा पहचाना नहीं जा सकता है, तो जांच के लिए सेटिंग को फिर से बंद किया जा सकता है। ध्यान दें कि उस बिंदु से संकलित प्रभाव प्रश्नों को स्थापित करने में एक परिवर्तन आगे है। इसके अलावा, जब भी 'सर्वर' प्रॉपर्टी में बदलाव किया जाता है, तो यह देखने के लिए कि क्या कैश में बदलाव होगा या नहीं, यह सत्यापित करने के लिए एक ही संस्करण में नॉनप्रॉड उदाहरण पर चेक करें। मुझे व्यक्तिगत रूप से उससे आश्चर्य हो रहा है। (उदाहरण के लिए, सर्वर स्तर पर मैक्सडॉप को बदलना आमतौर पर प्लान कैश फ्लश करता है)

"संकलित योजना स्टब में इसके साथ एक निष्पादन योजना नहीं होती है और योजना के संचालन के लिए क्वेरी करने से कोई XML शोटेन वापस नहीं आएगा।" http://technet.microsoft.com/en-us/library/cc645587.aspx

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.