Sql-Server

如何查詢包含特定缺失索引的記憶體計劃?

  • February 23, 2021

我看到一個表的潛在缺失索引,但想首先查詢所有具有該特定缺失索引的記憶體計劃(以便稍後在建構新索引後測試這些查詢)。你如何建構這樣的查詢?sp_blitzcache 可以在這裡提供幫助嗎?

這無論如何都不是萬無一失的,但作為粗略的完整性檢查,您可以使用以下查詢,該查詢利用DMV過濾您計劃索引的記憶體計劃文本的表名和索引名:

SELECT 
   PlanText.[dbid] AS DatabaseId,
   DB_NAME(PlanText.[dbid]) AS DatabaseName,
   CachedPlans.plan_handle AS PlanHandle, 
   OBJECT_NAME(PlanText.objectid) AS ObjectName, 
   CachedPlans.objtype AS ObjectType, 
   CachedPlans.refcounts AS CachedPlanReferenceCount, 
   CachedPlans.usecounts AS CachedPlanUseCount, 
   PlanText.[text] AS QueryText
FROM sys.dm_exec_cached_plans AS CachedPlans
CROSS APPLY sys.dm_exec_sql_text(CachedPlans.plan_handle) AS PlanText
WHERE PlanText.[text] LIKE '%YourTableName%'
   AND PlanText.[text] LIKE '%YourColumnToBeIndexed%'

這利用了 DMVsys.dm_exec_cached_planssys.dm_exec_sql_text. 只需將上面的萬用字元過濾器替換為您的表名和索引即可。這將為您提供記憶體計劃的實際查詢,因此您可以在創建索引後重新測試它。我還包括了一些可能有用的列DatabaseName,例如CachedPlanReferenceCount(有多少對象引用了這個記憶體計劃)和CachedPlanUseCount(這個計劃被使用了多少次)。因此,理論上您也可以添加一個ORDER BY CachedPlanUseCount DESC子句來獲取最常用的查詢並優先考慮您的列表。

這不完美的一個原因是,如果QueryText列中的查詢包含與您正在索引的列同時具有相同名稱的不同列,但來自不同的表,因此將是誤報匹配。

引用自:https://dba.stackexchange.com/questions/285844