上篇文章讲了如何查询索引的使用情况,前提是索引已经创建了。
这篇文章要讲的是SQL Server对系统中运行的sql进行监控,把系统中缺少的索引信息保存下来,提供给我们查询。
我们根据这些辅助的信息,结合实际的情况,比如:表上已经有的索引,涉及到的字段,以及具体的sql,判断如果创建了这些索引,是否真的能提高性能,如果真的能提高性能,就可以创建这些索引。
通过查询3个视图,可以了解如果创建了这个索引,对性能有多大的提升(Improvement_Measure ):
sys.dm_db_missing_index_groups
sys.dm_db_missing_index_group_stats
sys.dm_db_missing_index_details
代码如下:
SELECT TOP 30
ROUND(s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
+ s.user_scans ),
0) AS [Total Cost] ,
s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
+ s.user_scans ) AS Improvement_Measure ,
DB_NAME() AS DatabaseName ,
d.[statement] AS [Table Name] ,
equality_columns ,
inequality_columns ,
included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
WHERE s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
+ s.user_scans ) > 10
ORDER BY [Total Cost] DESC ,
s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
+ s.user_scans ) DESC