SQL Server 查詢最佳化器在編譯過程中會記錄「若有此索引可改善查詢」的建議,儲存於 Missing Index 相關 DMV。本文提供完整查詢腳本,計算改善度量並自動生成 CREATE INDEX DDL,輔助索引調優決策。
SELECT
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
'CREATE INDEX [missing_index_'
+ CONVERT(VARCHAR, mig.index_group_handle) + '_'
+ CONVERT(VARCHAR, mid.index_handle) + '_'
+ LEFT(PARSENAME(mid.statement, 1), 32) + ']'
+ ' ON ' + mid.statement
+ ' (' + ISNULL(mid.equality_columns, '')
+ CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
+ ISNULL(mid.inequality_columns, '') + ')'
+ ISNULL(' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY improvement_measure DESC;
improvement_measure:綜合評分 = 平均查詢成本 × 平均改善% × (搜尋+掃描次數)。越高代表潛在收益越大。equality_columns:WHERE JOIN ON 中等值比較欄位(適合放索引鍵前段)。inequality_columns:範圍比較欄位(<、>、BETWEEN),適合放索引鍵後段。included_columns:SELECT 清單中非條件欄位,放 INCLUDE 實現覆蓋索引。mid.statement:完整物件名稱 [db].[schema].[table]。sys.indexes 去重。improvement_measure > 10 為經驗值,視系統負載調整。sys.dm_db_index_usage_stats 確認新索引被使用。