2011-08-19 13 views
5

हमने हाल ही में एक प्रदर्शन समस्या थी और इसे डीबीसीसी फ्रीप्रोकैच को निष्पादित करके हल किया गया ... अब, हमारे पास जवाब देने के लिए बहुत अधिक प्रश्न हैं;डीबीसीसी फ्रीप्रोकैश?

  • क्या प्रक्रिया कैश बनाया बाहर दिनांकित?
  • यदि सूचकांक या सांख्यिकी दिनांकित हैं, तो क्वेरी क्यों पुन: संकलित नहीं हुई?
  • क्या यह एक अच्छा अभ्यास है जो डीबीसीसी फ्रीप्रोकैच को जॉब के रूप में शेड्यूल करना है?
  • क्या संभावित दिनांकित क्वेरी योजनाओं की पहचान करने का कोई तरीका है?
  • क्या कोई अपमानजनक क्वेरी पहचानने का कोई तरीका है?

किसी भी मदद की सराहना की जाती है!

+0

कृपया पहचानें कि आप किस SQL ​​सर्वर का उपयोग कर रहे हैं, उदाहरण के लिए [टैग: एसक्यूएल-सर्वर-2005], [टैग: एसक्यूएल-सर्वर -2008] ... –

+2

सभी 'डीबीसीसी फ्रीप्रोकैचे' प्रक्रिया कैश खाली है। यह आंकड़ों को अद्यतन नहीं करेगा। इसके विपरीत यदि आंकड़े ऑटो अपडेट हो जाते हैं तो योजना का पुन: संकलित किया जाएगा।मुझे लगता है कि आपके पास समस्या का स्नीफिंग पैरामीटर था जहां एक क्वेरी के लिए कैश में मौजूद योजना सभी संभावित पैरामीटर मानों के लिए उपयुक्त नहीं थी। –

+0

मैं SQL सर्वर 2005 पर हूं! – user173552

उत्तर

8

आपके प्रश्न पूरे जगह पर हैं, इसलिए मैं उन सभी को संबोधित करने की कोशिश करूंगा। प्रक्रिया कैश केवल इतना बड़ा है। आपकी प्रक्रिया कैश एकल-उपयोग योजनाओं से भरी हो सकती है (इसका आंकड़ों पर कोई प्रभाव नहीं पड़ता है, हालांकि आंकड़े योजना कैश को प्रभावित कर सकते हैं)। आप किम्बरली ट्रिप के ब्लॉग पोस्ट, "Plan cache and optimizing for adhoc workloads" में एकल उपयोग योजनाओं के बारे में बहुत सारे विवरण पढ़ सकते हैं - sys.dm_exec_cached_plans के विरुद्ध एक क्वेरी सहित, यह पहचानने में सहायता करेगा कि कैश को कई एकल उपयोग योजनाओं के साथ कबूल किया जाता है। जैसा कि वह सुझाव देती है, आप विज्ञापन के वर्कलोड के लिए ऑप्टिमाइज़ का उपयोग करके इस सूजन को रोक सकते हैं। यदि आपको अक्सर ऐसा करने की आवश्यकता मिल रही है, तो मैं कहूंगा कि नौकरी के रूप में फ्रीप्रोकैच शेड्यूलिंग एक बैंड-एड्स है, समाधान नहीं।

"खराब" योजना को साफ़ करने के लिए, सबसे पहले आपको "खराब" योजना की पहचान करने की आवश्यकता है। यह एक ऐसी योजना हो सकती है जो किसी निश्चित आकार से अधिक हो और/या कुछ समय में निष्पादित नहीं की गई हो, या आपने लंबे समय से चलने वाली क्वेरी आदि की पहचान की हो। दुर्भाग्य से पैरामीटर का शिकार करने वाली योजना की पहचान करना आसान नहीं है तब तक स्नीफिंग जब तक कि आप पहले से ही पूछे जाने वाले प्रश्न या प्रश्नों को नहीं जानते हैं। मान लेते हैं कि आप कैश किया है कि एक सप्ताह से अधिक में नहीं किया गया में सबसे पुराना योजनाओं को खोजने के लिए चाहते हैं:

;WITH x AS 
(
    SELECT TOP 10 
     qs.[sql_handle], qs.plan_handle, 
     txs = qs.statement_start_offset, 
     txe = qs.statement_end_offset, 
     [size] = cp.size_in_bytes, 
     [uses] = SUM(cp.usecounts), 
     [last] = MAX(qs.last_execution_time) 
    FROM 
     sys.dm_exec_query_stats AS qs 
    INNER JOIN 
     sys.dm_exec_cached_plans AS cp 
     ON qs.plan_handle = cp.plan_handle 
    WHERE 
     qs.last_execution_time < DATEADD(DAY, -7, CURRENT_TIMESTAMP) 
    GROUP BY 
     qs.[sql_handle], qs.plan_handle, cp.size_in_bytes, 
     qs.statement_start_offset, qs.statement_end_offset 
    ORDER BY 
     [size] DESC 
) 
SELECT 
    x.plan_handle, 
    size, uses, [last], 
    [statement] = COALESCE(NULLIF(
     SUBSTRING(t.[text], x.txs/2, 
      CASE WHEN x.txe = -1 THEN 0 ELSE (x.txe - x.txs)/2 END 
     ), ''), t.[text]) 
FROM x 
CROSS APPLY sys.dm_exec_sql_text(x.[sql_handle]) AS t; 

अब आप सत्यापित करें कि आप वास्तव में इस योजना को साफ़ करना चाहते हैं की जरूरत है। उदाहरण के लिए, यदि आप उस क्वेरी को पहचानते हैं जो सीईओ कल चला सकता है, तो शायद इसे वहां छोड़ना सबसे अच्छा हो। आप योजना साफ़ करना चाहते हैं, तो आप सीधे कह कर स्पष्ट कर सकते हैं:

DBCC FREEPROCCACHE([paste plan handle from above query here]); 

यह DBCC FREEPROCCACHE विश्व स्तर पर चलाने की तुलना में एक बहुत अधिक काम की तरह लगता है, लेकिन आप कैश में अच्छा योजनाओं का एक बहुत है, यह निश्चित रूप से आपके उपयोगकर्ताओं के लिए बेहतर होगा।

फिर भी, यह वास्तव में बैंड-सहायता की तरह लगता है। यदि आपका कैश जंक के साथ भर रहा है और प्रदर्शन तब तक शौचालय में जाता है जब तक आप कैश को मुक्त नहीं करते हैं, आपको आर्किटेक्चर पर उच्च स्तर, प्रश्नों को कैसे सबमिट किया जाता है, आदि की आवश्यकता होती है। यह वह व्यवहार है जिसे मैं उम्मीद करता हूं LINQ2SQL का पहला पुनरावृत्ति, जहां यह प्रत्येक स्ट्रिंग तर्क के लिए एक क्वेरी के लिए एक योजना के संस्करण को कैश करेगा जो एक अलग लंबाई थी। तो यदि आपके पास 'जनवरी' का पैरामीटर था तो आपको 'फरवरी' के पैरामीटर के मुकाबले एक अलग योजना मिल जाएगी क्योंकि यह डेटा प्रकार को VARCHAR(7) बनाम VARCHAR(8) के रूप में परिभाषित करेगा। बहुत यकीन है कि व्यवहार ठीक हो गया है लेकिन मुझे आपके पर्यावरण/एप्लिकेशन के बारे में पर्याप्त जानकारी नहीं है कि यह सुझाव देने के लिए कि "बुरे विचारों" को कहां देखना है।

+0

विज्ञापन कार्य वर्कलोड के लिए अनुकूलित करें - यह SQL Server 2008 के साथ पेश किया गया था। –

संबंधित मुद्दे