SQL 2005 未使用的過程
我正在嘗試獲取整個 SQL 伺服器中未使用的過程的列表。我已經完成了獲取所有程序的列表,現在我正在使用以下腳本來確定使用了哪些程序。
DECLARE @command varchar(1000) SELECT @command = 'USE [?] SELECT qt.text AS "SP Name", qs.execution_count AS "Execution Count", qs.max_logical_reads, qs.max_logical_writes, qs.creation_time, DB_NAME() as DatabaseName, DATEDIFF(Minute, qs.creation_time, GetDate()) AS "Age in Cache" FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt ORDER BY qt.text DESC' EXEC sp_MSforeachdb @command
我知道這只會顯示重啟後使用的程序。數據似乎有點作用——然而;我遇到的問題是它似乎顯示了整個程序文本 IE:
創建過程 dbo.proc_MSS_PropagationGetQueryServers AS
DECLARE @Temp 表(ServerID int,SearchServerName nvarchar(31),IndexDirectory nvarchar(260),
MachineStatus int,LastPropagationTime 日期時間,
PropagationStatus int)插入到@Temp
SELECT SearchServerID,SearchServerName,
IndexDirectory,MachineStatus,LastPropagationTime, 1 AS PropagationStatus 來自
dbo.MSSPropagationSearchServerTable 更新 @Temp
SET PropagationStatus = 0 WHERE NOT EXISTS (SELECT * FROM dbo.MSSPropagationSearchServerReady AS R WHERE ServerID = R.SearchServerID) AND (1 < DATEDIFF(m, LastPropagationTime, GETUTCDATE()) 或 30 < DATEDIFF(s, LastPropagationTime, GETUTCDATE()) ) CREATE TABLE #UnresponsiveQueryServers (
ServerID int) INSERT #UnresponsiveQueryServers EXEC
dbo.proc_MSS_PropagationGetUnresponsiveQueryServers UPDATE
@Temp SET PropagationStatus = 3 WHERE
ServerID IN (SELECT ServerID FROM #UnresponsiveQueryServers)
UPDATE @Temp SET PropagationStatus = 2
WHERE MachineStatus = 0 OR MachineStatus = 1 OR
MachineStatus = 2 選擇 SearchServerName、
IndexDirectory、MachineStatus、PropagationStatus
FROM @Temp
我只想要程序本身的名稱。所以在這種情況下 proc_MSS_PropagationGetQueryServers
任何人都可以在這方面提供幫助?
你正在尋找的東西實際上是不可能的,至少不是按照你最終想要完成的精神。正如我在回答幾乎是一個重複的問題時所解釋的那樣——查詢上次使用/讀取視圖、函式或 sp 的時間——這種方法沒有考慮應用程式碼中不經常訪問的程式碼路徑和“支持”手動執行的程式碼,通常在 SSMS 中。這很糟糕,但你真的只需要對所有可能正在執行儲存過程的程式碼進行詳盡的審查,以及支持票證,其中包括關於在 X 的情況下執行什麼的說明,甚至可能有指示指示的內部 wiki 頁面執行儲存過程(或使用 UDF 等)。
此外,您可以創建一個表來記錄使用情況,對於那些您認為“未使用”的儲存過程,請在頂部添加一行以插入到此日誌表中。定期檢查該日誌表,並與您的團隊/部門設置一個截止時間,如果在這段時間內沒有訪問該程式碼,每個人都可以放心地擺脫該程式碼。
PS我以前經歷過這個過程。而且我有支持人員在發布後不久給我(或我的經理)打電話,因為我刪除了一些在任何其他程式碼或內部 wiki 頁面等中沒有引用的程式碼(相信你我,我的研究非常徹底!)。但是,它被用於 Microsoft Access 應用程序中,該應用程序是支持工程師在幾年前創建的,以使某些支持任務/請求花費更少的時間(即不需要等待 2 週讓 DBA 開始執行儲存過程,以便客戶可以做他們需要做的)。而且由於我們的數據庫工程師都沒有意識到這個應用程序的存在(它只在支持區域的少數桌面上,而且肯定不在 SVN 中),所以它有點難以考慮。
PPS關於此聲明:
我知道這只會顯示重啟後使用的程序。
這是最多可以顯示的。但是,重新啟動並不是清除記憶體系統數據的唯一方法。以下任一命令也將清除該數據:
DBCC FREEPROCCACHE; DBCC FREESYSTEMCACHE('ALL');
並且,當存在記憶體壓力(即可用物理記憶體不足)時,SQL Server 會定期轉儲記憶體的數據。
因此,您不能為此目的使用任何 DMV / DMF 的輸出。
PPPS
sys.dm_exec_query_stats
DMV 工作在伺服器/實例級別,而不是數據庫級別。這意味著,您不僅不需要將此類查詢包裝在 中sp_MSforeachdb
,而且無論如何您都不想這樣做,因為每個數據庫都會重複相同的結果集。PPPPS
sys.dm_exec_sql_text
您已經在使用的DMF 可以方便地返回objectid
和列dbid
。該dbid
列可以與DB_NAME()
您已經用於獲取該查詢的“目前”數據庫名稱的內置函式一起使用。而且,dbid
和objectid
列都可以與OBJECT_NAME()
內置函式一起使用,以獲取儲存過程的名稱,相對於“目前”數據庫(與您正在執行此查詢的數據庫相反,它可能返回錯誤值,因為對象可能不在該數據庫中)。然後這兩個函式都可以在ORDER BY
子句中再次使用。考慮到所有這些資訊,重寫的查詢是:
SELECT DB_NAME(qt.[dbid]) AS [DatabaseName], OBJECT_NAME(qt.[objectid], qt.[dbid]) AS [SP Name], qs.execution_count AS [Execution Count], qs.max_logical_reads, qs.max_logical_writes, qs.creation_time, DATEDIFF(Minute, qs.creation_time, GetDate()) AS [Age in Cache] FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt ORDER BY DB_NAME(qt.[dbid]) DESC, OBJECT_NAME(qt.[objectid], qt.[dbid]) DESC;