我知道这个线程已经有一段时间了,但我想我会添加我的 2 位。我们在我们的 sql server 2005 生产数据库上遇到问题,其中 cpu 经常整天以 80% 到 100% 的速度运行.我们尝试了运行跟踪、评估作业、碎片整理、释放磁盘空间,以及我们能想到的一切,但没有任何帮助。最后,我们在博客网站上找到了一篇文章(恐怕我们不记得是哪一篇了),它推荐使用 Sql Server 的缺失索引功能。
事实证明,SQL Server 2005 及更高版本都具有此功能; SQL Server 不断评估和记录它认为有助于提高性能的推荐索引。我们运行下面的查询并实现了前 130 个索引(显示最大潜在收益的索引)。在一天中最繁忙的时段,我们的整体 db cpu 性能现在下降到 30% 到 40%,而且所有用户都告诉我们,他们的应用程序响应速度更快。
一些注意事项。我们不是 DBA,因此您可以自行决定添加索引。此外,向任何一个表添加过多索引可能会损害性能 - 因此请注意要添加的索引并始终注意索引过载。
SELECT mid.database_id,
db.name,
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
INNER JOIN sys.dm_db_missing_index_group_stats migs
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid
ON mig.index_handle = mid.index_handle
INNER JOIN sys.databases db
ON mid.database_id = db.database_id
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC