2012-05-02 5 views
17

मैं डेटाबेस में सभी संग्रहीत प्रक्रियाओं को ट्रैक करने का प्रयास कर रहा हूं जिनका उपयोग कभी नहीं किया गया है, या जिनका उपयोग कई महीनों में नहीं किया गया है।गैर-उपयोग की गई संग्रहीत प्रक्रियाओं को खोजने के लिए TSQL क्वेरी

मैं उन सभी संग्रहीत प्रक्रियाओं को दिखाने के लिए एक क्वेरी खोजना चाहता हूं जो उपयोग में नहीं हैं ताकि उन संग्रहित प्रक्रियाओं का विश्लेषण किया जा सके ताकि यह निर्धारित किया जा सके कि उन्हें हटाया जा सकता है या नहीं।

मैं sys.procedures से परिचित हूं, लेकिन यह नहीं पता कि प्रक्रिया कैसे उपयोग की जा रही है या नहीं।

SELECT * 
FROM sys.procedures; 

SQL सर्वर 2008 R2 का उपयोग करना।

अद्यतन अद्यतन अद्यतन

नीचे हारून बर्ट्रेंड से क्वेरी का उपयोग करना, थोड़ा संशोधित, यह क्या मैं का उपयोग कर समाप्त हो गया है, और यह सही था।

SELECT p.* 
    FROM sys.procedures AS p 
    LEFT JOIN sys.dm_exec_procedure_stats AS s ON s.[object_id] = p.[object_id] 
WHERE s.object_id IS NULL; 

हेलप के लिए धन्यवाद।

+0

क्षमा करें शिव, जो मैं ढूंढ रहा था वह काफी नहीं है। नीचे दिए गए उत्तर फार्म हारून ने किया। –

उत्तर

26

DMVs प्रक्रियाओं के लिए आँकड़े रिकॉर्ड करेगा, लेकिन वे केवल संभवतः रूप में वापस दूर पिछले पुनः आरंभ करने के रूप में जाना (और अक्सर नहीं है कि अब तक, कब तक एक योजना कैश में रहती है पर निर्भर करता है):

SELECT * FROM sys.dm_exec_procedure_stats AS s 
INNER JOIN sys.procedures AS p 
ON s.[object_id] = p.[object_id] 
ORDER BY p.name; 

तो अगर आपका सिस्टम केवल थोड़े समय के लिए रहा है, यह एक विश्वसनीय उपाय नहीं है। लिंक @ सिवा पॉइंट्स कुछ अन्य विचारों के लिए भी उपयोगी है। दुर्भाग्य से एसक्यूएल सर्वर वास्तव में समग्र आप के लिए यह ट्रैक नहीं करता है तो जब तक आप का पता लगाने या प्रवेश करने पर आप विश्वास करते आप DMV में जगह के साथ फंस रहे हैं जोड़ने ...

संपादित यह एक अच्छा मोड़ था, मैं के लिए सुलझाने था की प्रक्रिया रन है। इसके बजाय आप इस चाहते हो सकता है:

SELECT sc.name, p.name 
FROM sys.procedures AS p 
INNER JOIN sys.schemas AS sc 
    ON p.[schema_id] = sc.[schema_id] 
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st 
    ON p.[object_id] = st.[object_id] 
WHERE st.[object_id] IS NULL 
ORDER BY p.name; 

या आप भी प्रक्रियाओं है कि रूप में अच्छी तरह चलाने के शामिल करने के लिए चाहते हो सकता है, लेकिन आदेश से उन्हें पिछली बार कब भागा उन्हें:

SELECT sc.name, p.name 
FROM sys.procedures AS p 
INNER JOIN sys.schemas AS sc 
    ON p.[schema_id] = sc.[schema_id] 
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st 
ON p.[object_id] = st.[object_id] 
ORDER BY st.last_execution_time, p.name; 

यह पहली प्रक्रियाओं आदेश देगा कि पुनरारंभ करने के बाद से नहीं चला है, फिर शेष जब उन्हें अंतिम, सबसे पहले सबसे पहले निष्पादित किया गया था।

+0

हारून, धन्यवाद। जो आपने मुझे दिया वह वास्तव में करीब था, एक छोटे से बदलाव के साथ यह वही किया जो मैंने खोजा था। चयन पी। * Sys.procedures से एएस पी बाएं जॉइन sys.dm_exec_procedure_stats एएस एस ऑन। [Object_id] = p। [Object_id] जहां s.object_id शून्य है; –

+0

हां, मैं समझता हूं कि यह केवल अंतिम पुनरारंभ करने के लिए वापस है। यह मेरे लिए बहुत अच्छा है। धन्यवाद! –

+0

मैं ** ** नहीं कहूंगा _ "यह केवल अंतिम पुनरारंभ करने के लिए वापस है" _। यह ** _ _ _ कैश है और कैश हमेशा गति में है (चीजें चल रही हैं और चीजें बाहर जा रही हैं)। कृपया यहां @ जेफमोडेन का प्रतिक्रिया देखें: http://stackoverflow.com/a/13506187/555798 – MikeTeeVee

2

यहाँ स्वीकार किए जाते हैं जवाब पर एक परिवर्तन हो तो मेरे लिए सबसे उपयोगी था:

SELECT sc.NAME + '.' + p.NAME [Procedure] 
    ,s.last_execution_time 
FROM sys.procedures AS p 
LEFT JOIN sys.dm_exec_procedure_stats AS s ON p.[object_id] = s.[object_id] 
INNER JOIN sys.schemas sc ON p.schema_id = sc.schema_id 
ORDER BY s.last_execution_time 
    ,sc.NAME 
    ,p.NAME 

संशोधनों पिछले निष्पादन समय प्रदर्शित करने और प्रक्रिया की स्कीमा शामिल हैं।

0

किसी कारण से, मेरे dm_exec_procedure_stats दृश्य दिन के माध्यम से स्वयं को साफ़ कर देता है। तो मैंने अभी अभी इसे चलाया है और सबसे पहले निष्पादन के समय आज सुबह से हैं, लेकिन मुझे पता है कि हमने आज सुबह या कुछ भी एसक्यूएल को पुनरारंभ नहीं किया है।

वैसे भी, मैं एक ऐसी प्रक्रिया बनाना चाहता था जिसे मैं हर घंटे चलाने के लिए नौकरी में डाल सकता हूं और हाल ही में कौन सी प्रोसेस चला सकता था। यहां मैंने किया है:

निष्पादित किए गए प्रोसेस को लॉग करने के लिए एक तालिका बनाई गई और उनका पहला और अंतिम निष्पादन समय।

create table ProcsThatExecute (procName varchar(500), firstExecutionTime datetime, lastExecutionTime datetime) 

एक प्रक्रिया है जो सम्मिलित करता है या ProcsThatExecute तालिका अद्यतन करता है बनाया गया। नौकरी में हर घंटे इसे चलाएं और कुछ दिनों या हफ्तों या महीनों के बाद आपके पास लॉग का उपयोग किया जाता है:

alter procedure LogProcsThatExecute as begin 

    --If they don't already exist in this table, add them. 
    insert into ProcsThatExecute(procName, firstExecutionTime, lastExecutionTime) 
    SELECT p.NAME ProcName, s.last_execution_time, null 
    FROM sys.procedures AS p 
     LEFT OUTER JOIN sys.dm_exec_procedure_stats AS s ON p.[object_id] = s.[object_id] 
    where not exists (
     select 1 from ProcsThatExecute pte where pte.procName = p.name 
    ) and last_execution_time is not null 


    --If they do exist in this table, update the last execution time. 
    update ProcsThatExecute set lastExecutionTime = s.last_execution_time 
    from ProcsThatExecute pte 
    inner join sys.procedures AS p on pte.procName = p.name 
     LEFT OUTER JOIN sys.dm_exec_procedure_stats AS s ON p.[object_id] = s.[object_id] 
    where s.last_execution_time is not null 

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