我正在修改创建查询以查找缺失的索引。我已经在他们的SQL Server DMV Starter Pack电子书中采用了Red-Gate人员创建的基本查询,并对其进行了一些修改。 sys.dm_db_missing_index_group_stats
中有几列我不知道如何解释。他们是:
avg_total_user_cost
avg_user_impact
根据文档,我发现avg_total_user_cost定义为 表示每次执行用户查询时的平均总用户成本 。并且,avg_user_impact 将值表示为百分比。它显示了创建索引时可以获得的改进量。
我的查询说应该添加的索引显示2.22平均用户成本和99.82用户影响。这些数字到底意味着什么?这是否意味着添加索引,我可以将关联查询的速度提高99.82%。我不知道2.22可能意味着什么。
感谢。
答案 0 :(得分:9)
我对这些的解释是:
avg_total_user_cost
是当前的
所有查询的平均值
可能从创作中受益
丢失的索引组。 “成本”是一个
无单位值由
优化。请参阅:SQL SERVER – Execution Plan – Estimated I/O Cost – Estimated CPU Cost – No Unit
avg_user_impact
是一个百分比
表示所有查询的平均成本降低
如果创建了缺失的索引组。该
百分比越高,越大
新指数的好处将是。
答案 1 :(得分:3)
@ Joe的回答似乎是正确的,我只是添加一些可能有用的信息:
有一篇文章here使用此计算来提供总体影响值:
avg_total_user_cost * avg_user_impact * (migs.user_seeks + migs.user_scans))
以下是他们建议的查询:
SELECT CONVERT (varchar, getdate(), 126) AS runtime,
mig.index_group_handle, mid.index_handle,
CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact *
(migs.user_seeks + migs.user_scans)) AS improvement_measure,
'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' +
CONVERT (varchar, mid.index_handle) + ' 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 AS mig
INNER JOIN sys.dm_db_missing_index_group_stats AS migs
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid
ON mig.index_handle = mid.index_handle
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC
结果improvement_measure
是无单位的,即仅在相对意义上有用,但这应该有助于将dm_db_missing_index_group_stats
中的不同值组合成一些有用的决策。