2012-05-02 84 views
17

我想追查一個數據庫中所有從未使用過的數據庫中的數據庫,或者在數月內還沒有使用過的存儲過程。查詢TSQL查詢找到未使用的存儲過程

我想找到一個查詢,以顯示所有未使用的,使這些存儲過程進行分析,以確定它們是否可以被刪除的存儲過程。

我熟悉sys.procedures,但不知道如何確定一個程序在使用或不使用。

SELECT * 
FROM sys.procedures; 

使用SQL Server 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

對不起溼婆,那不是完全是我一直在尋找。下面Aaron的答案就是這樣做的。 –

回答

26

的DMV將記錄程序統計,但他們只可能去早在上次重新啓動(通常不那麼遠,取決於計劃住在緩存多久):

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; 

所以,如果你的系統只有很短的時間,這不是一個可靠的措施。 @Siva指出的鏈接對其他一些想法也很有用。不幸的是這樣,除非您添加跟蹤或登錄你被卡住你在DMV的信任的SQL Server並沒有真正跟蹤此爲你的整體...

編輯這是一個很好的點,我是求解運行的程序。相反,你可能希望這樣的:

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

亞倫,謝謝。你給我的東西非常接近,有一點改變,它完全符合我的要求。選擇P * FROM sys.procedures爲P LEFT JOIN sys.dm_exec_procedure_stats AS S ON S [的object_id] = P [的object_id] WHERE s.object_id爲NULL。; –

+0

是的,我知道這只是回到最後一次重啓。這對我來說很有好處。謝謝! –

+0

我就** **不說_「這僅僅是回到過去重新開始」 _。這**完全是緩存,並且緩存始終處於運動狀態(事情正在進行,事情正在發生)。請參閱@ JeffModen的迴應在這裏: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視圖在整個一天中都清除了。所以我現在就運行它,最早的執行時間是從今天早上開始的,但是我知道我們今天早上沒有重啓SQL。

不管怎樣,我想創建一個進程,我可以投入作業運行每隔一小時,並捕獲其特效最近運行。下面是我做的:

創建一個表記錄得到執行和他們的第一個和最後一個執行時間的特效。

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