SQL 服务器非聚集索引 - 包含值

SQL Server Non Clustered Index - Include values

我对 SQL 服务器优化和索引的世界还比较陌生。我 运行 一个推荐缺失索引 (https://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/) 的查询,但我无法理解 Include 子句的差异。

我的两个索引的唯一区别是 Index1 包含 'Email' 列而 Index2 不包含。这两个索引都是必需的还是 Index1 就足够了?我相信只需要 Index1 但我不确定。

CREATE INDEX [Index1] 
ON [ActiveDirectory].[dbo].[ActiveDirectory] ([MailEnabled], [Active]) 
INCLUDE ([EmployeeID], [DisplayName], [Email])


CREATE INDEX [Index2] 
ON [ActiveDirectory].[dbo].[ActiveDirectory] ([MailEnabled], [Active]) 
INCLUDE ([EmployeeID], [DisplayName])

谢谢!

灰熊

只需要第一个索引。

如果您得到这两个建议,那是因为一个查询需要所有三个包含列(一个 'covering index')来满足查询,而不必在主聚集索引上查找以获取列...第二个查询只需要其中两个。

包含所有三个包含列的一个覆盖索引满足两个查询。

尝试同时创建两者会创建大量重复数据并减慢插入速度并无缘无故地使用更多磁盘space。

这取决于 您在 select 语句中需要哪些列 如果你需要全部三个 [EmployeeID], [DisplayName], [Email] - 创建 Index1

否则,创建Index2

粗略地 - 您在 WHERE 谓词中使用的字段应该在索引的 ON 部分,而您在 SELECT 中使用的列应该在'INCLUDE'(如果它们未在 ON 中提及)

请参阅 Creating Indexes with Included Columns 示例

两个索引同时存在,绝对是 - 不需要

基本上,索引的 INCLUDE 部分中的列不参与索引结构,而是附加到索引,因此您不必返回到 table 并通过PK查找数据。

您可以通过 ON 子句中的列有效地 "look up": [MailEnabled], [Active] ,并且您可以将它们包含在 select 中而无需额外费用。

您还可以 select 您的 INCLUDE 子句中的列,无需额外费用 [EmployeeID], [DisplayName], [Email] - 但搜索(过滤、连接、查找)速度不会很快