1

我正在努力提高我们的 SQL 性能。SQL Server Management Studio 给出了一个令我惊讶的建议。为了示例的缘故,我将简化表结构和 SSMS 给出的建议。

Person的表结构:

  • ID
  • 出生日期
  • 电子邮件

我有一个特定的查询,我显示了执行计划。然后我看到了 SSMS 给出的建议,这让我有点惊讶。建议添加两个具有以下签名的索引,这将分别提高 41% 和 53% 的性能:

CREATE NONCLUSTERED INDEX [person_1]
  ON [Person]([first_name],[last_name])
  INCLUDE ([id],[date_of_birth],[email])

CREATE NONCLUSTERED INDEX [person_2]
  ON [Person]([first_name],[last_name])
  INCLUDE ([id],[email])

这两个索引位于相同的列上。只有 INCLUDE 列不同。我从阅读索引中的理解是,第一个索引也包括第二个索引的数据。那么为什么 SSMS 推荐第二个索引以及第一个索引已经包含所需的数据呢?

4

1 回答 1

0

永远不要使用 SSMS 建议。该建议基于特定查询。

而是探索像 sys.dm_db_missing_index_details 这样的系统视图。查看更多关于sys.dm_db_missing_index_details

或查看 Glenn Berry 在2019 年 4 月的 SQL Server 诊断信息查询上的 DMV 查询

… 或者更好的是 Brent Ozar sp_blitzindex BrentOzarULTD/SQL-Server-First-Responder-Kit

… 或者接受这个查询

SELECT DB_NAME(database_id) AS database_name, 
       OBJECT_NAME(object_id, database_id) AS table_name, 
       mid.equality_columns, 
       mid.inequality_columns, 
       mid.included_columns, 
       (migs.user_seeks + migs.user_scans) * migs.avg_user_impact AS Impact, 
       migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS Score, 
       migs.user_seeks, 
       migs.user_scans
FROM sys.dm_db_missing_index_details mid
     INNER JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle
     INNER JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
ORDER BY migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) DESC;
于 2019-04-23T19:30:14.880 回答