
除了浪費資料庫空間之外,SQL Server 上不必要的索引還會減慢插入和更新作業的速度。缺乏資料庫原理經驗的開發人員有時傾向於創建對正在運行的查詢沒有意義的表索引。
SQL Server 2005/2008 是否有一個通用的程序或工具來分析資料庫工作負載並給出在某個操作資料庫上從未使用或不需要的索引的提示?
謝謝你!
答案1
我在這裡看到一個可愛的小 T-SQL 腳本(http://blog.sqlauthority.com/2008/02/11/sql-server-2005-find-unused-indexes-of-current-database/) 顯示應在 SQL Server 2005 上執行的未使用索引。http://aspadvice.com/blogs/ssmith/archive/2008/03/31/Find-Unused-SQL-2005-Indexes-for-Current-DB.aspx這裡也。
看起來 dm_db_index_usage_stats 是這一切的關鍵。很簡約! (看http://msdn.microsoft.com/en-us/library/ms188755.aspx 我將不得不查看我現在創建的一些生產資料庫,看看這些統計數據是什麼樣的。 (微笑)
編輯:這裡有一些非常好的附加背景:http://blogs.msdn.com/craigfr/archive/2008/10/30/what-is-the-difference- Between-sys-dm-db-index-usage-stats-and-sys-dm-db-索引-操作-統計.aspx
答案2
使用 sys.dm_db_index_usage_stats 時需要記住的一些事項:
- 輸出僅包含自上次資料庫啟動以來使用過的索引。當資料庫關閉時,該資料庫的記憶體資訊快取中的所有條目都將被刪除。同樣,快取也無法在即時重新啟動後繼續存在。無法在不重新啟動資料庫的情況下手動清除特定資料庫的條目。第一個答案(以及我的部落格)中引用的各種文章描述瞭如何捕獲不同時間的輸出以進行時間序列分析。
- 請務必測試您的全部的商業週期。您不想刪除用於月末報告或 CEO 查詢的索引,儘管這可能很誘人。
- 在決定指數是否用於盈利或只是以費用維持之前,請確保您了解各種計數及其含義。
希望這可以幫助。
PS 對於其他閱讀本文並想知道 SQL Server 2000 是否有等效方法的人來說,還有一件事 - 不,我們(因為我當時在團隊中)僅在 2005 年之後添加了該功能。
答案3
我們在 SQLServerPedia 上有一篇 wiki 文章,其中包含執行此操作的腳本,以及有關如何使用它的教學影片:
一種尋找未使用索引的方法:
http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use
另一個要查找您應該添加的索引:
答案4
我做了一些與索引相關的查詢,並在我的部落格中展示了這一點(http://dbalink.wordpress.com/2008/11/09/how-to-finding-index-usage-stats-with-dmv-in-tsql/)