2008-11-14 51 views
17

找出一個對象是否被別的東西引用是一件小事。我想要做的是確定它是否實際使用在Microsoft SQL Server 2005中識別未使用的對象

我的解決方案最初涉及一個包含數據庫中對象列表和小時工作的表的組合。

這項工作做了兩件事。首先,它查找自上次運行以來已添加到數據庫的新對象。其次,它看着sql的對象緩存。如果表中的某個對象在緩存中列出,則表中的對象被標記爲最近「正在使用」。

在六個月的期限或其他任何事情結束時,檢查了表格的內容。自從我開始監控以來,表中列出的任何未被引用的內容都可能安全地備份和刪除。

當然,有可能只使用對象,例如每年一次或者其他任何事情,但似乎大部分工作。

雖然這是一種很痛苦的工作。

有大約半打的數據庫我的工作,其中大部分都噸遺留表對他們來說,這仍然長時間後,他們的原創者轉移到其他公司。

我在尋找的是跟蹤對象(表,視圖,存儲過程或函數)何時被調用的相當可靠的方法。

對於那些你們誰目前監控這樣的事情,你用什麼方法/代碼,你會推薦它?

回答

24

在SQL Server 2005中,可以使用動態管理視圖sys.dm_db_index_usage_stats。該名稱表示「索引」,但這有點誤導 - 即使它沒有任何索引,每個表在這裏都有一個條目。下面是從SQL雜誌的有用查詢:

SELECT 
    t.name AS 'Table', 
    SUM(i.user_seeks + i.user_scans + i.user_lookups) 
    AS 'Total accesses', 
    SUM(i.user_seeks) AS 'Seeks', 
    SUM(i.user_scans) AS 'Scans', 
    SUM(i.user_lookups) AS 'Lookups' 
FROM 
    sys.dm_db_index_usage_stats i RIGHT OUTER JOIN 
    sys.tables t ON (t.object_id = i.object_id) 
GROUP BY 
    i.object_id, 
    t.name 
ORDER BY [Total accesses] DESC 

這裏的原始文章:

http://www.sqlmag.com/Article/ArticleID/53878/sql_server_53878.html

請記住,這些使用統計信息reset當SQL Server重新啓動。

+1

我該如何調整它以查找未使用的視圖和存儲過程? – 2013-04-23 11:31:15