आपके प्रश्न पूरे जगह पर हैं, इसलिए मैं उन सभी को संबोधित करने की कोशिश करूंगा। प्रक्रिया कैश केवल इतना बड़ा है। आपकी प्रक्रिया कैश एकल-उपयोग योजनाओं से भरी हो सकती है (इसका आंकड़ों पर कोई प्रभाव नहीं पड़ता है, हालांकि आंकड़े योजना कैश को प्रभावित कर सकते हैं)। आप किम्बरली ट्रिप के ब्लॉग पोस्ट, "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)
के रूप में परिभाषित करेगा। बहुत यकीन है कि व्यवहार ठीक हो गया है लेकिन मुझे आपके पर्यावरण/एप्लिकेशन के बारे में पर्याप्त जानकारी नहीं है कि यह सुझाव देने के लिए कि "बुरे विचारों" को कहां देखना है।
कृपया पहचानें कि आप किस SQL सर्वर का उपयोग कर रहे हैं, उदाहरण के लिए [टैग: एसक्यूएल-सर्वर-2005], [टैग: एसक्यूएल-सर्वर -2008] ... –
सभी 'डीबीसीसी फ्रीप्रोकैचे' प्रक्रिया कैश खाली है। यह आंकड़ों को अद्यतन नहीं करेगा। इसके विपरीत यदि आंकड़े ऑटो अपडेट हो जाते हैं तो योजना का पुन: संकलित किया जाएगा।मुझे लगता है कि आपके पास समस्या का स्नीफिंग पैरामीटर था जहां एक क्वेरी के लिए कैश में मौजूद योजना सभी संभावित पैरामीटर मानों के लिए उपयुक्त नहीं थी। –
मैं SQL सर्वर 2005 पर हूं! – user173552