Sql-Server-2008
哪些儲存過程正在使用特定索引
我一直在查看我們數據庫中的索引(添加缺失的索引並刪除壞的索引)。我偶然發現了我幾個月前創建的一個索引,它看起來非常好。自上次伺服器重新啟動(大約 2 週前)以來,只有 109 次寫入,但有近 270 萬次讀取。通常,當我看到讀取多於寫入時,我會將其視為一項好工作並繼續進行下一項工作,但這看起來好得令人難以置信。
所以我的問題是:有沒有辦法確定哪些儲存過程正在使用索引?除了手動閱讀所有儲存過程並檢查連接和 where 條件。
我無法完全讓Jonathan 的 XML 查詢為我提取它,但我能夠通過簡單的方式解析 showplan_text 來獲得它。這是使用
AdventureWorks2012
並在發出查詢之後Sales.SalesOrderHeader
:DECLARE @Index SYSNAME = N'PK_SalesOrderHeader_SalesOrderID'; SELECT t.[text], s.execution_count, CONVERT(XML, p.query_plan) FROM sys.dm_exec_query_stats AS s CROSS APPLY sys.dm_exec_text_query_plan ( s.plan_handle, s.statement_start_offset, s.statement_end_offset ) AS p CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) AS t WHERE p.query_plan LIKE '%Index="\[' + @Index + '\]"%' ESCAPE '\';
結果:
要專門獲取儲存過程名稱(對於那些不是臨時發出的查詢),您需要確保您在數據庫的上下文中,然後將此列添加到上述查詢的輸出列表中:
, obj = QUOTENAME(OBJECT_SCHEMA_NAME(t.objectid)) + '.' + QUOTENAME(OBJECT_NAME(t.objectid))
此列將
NULL
用於任何臨時查詢。一旦查詢計劃出現在結果窗格中,您當然可以點擊 XML 來載入圖形計劃。然後,如果您安裝了SentryOne 計劃資源管理器和 SSMS 外掛,則可以右鍵點擊圖形計劃以在計劃資源管理器中查看。
請注意,查詢不會返回從另一個數據庫發出的查詢的結果,因此您應該在可能與目標數據庫一起使用的任何數據庫的上下文中重複查詢。
相比之下,Jonathan 的查詢應該能夠檢索計劃記憶體中引用具有指定名稱的任何索引的查詢(可能有多個)。即使這些查詢源自其他數據庫,您也可以進一步過濾以查找僅對這個特定的引用的引用。