2017-08-10 88 views
0

我对SQL Server优化和索引的世界比较陌生。我运行了一个查询,建议缺少索引(https://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/),并且我无法理解Include子句的差异。SQL Server非集群索引 - 包含值

我的两个索引唯一的区别是Index1包含'电子邮件'列和Index2不。这两个指标是必需的还是会足够的?我相信只有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]) 

谢谢!

Griz

+0

什么类型,并在值范围MailEnabled和Active? –

回答

0

这取决于你在select语句 需要做哪些列。如果你需要所有三个[EmployeeID], [DisplayName], [Email] - 创建Index1

否则,创建Index2

大致 - 您在WHERE使用的字段谓词应该位于索引的ON部分,并且您在SELECT中使用的列应该在'INCLUDE'中(如果它们未在ON中提及)

为例

同时两个指数见Creating Indexes with Included Columns,是最绝对 - 不需要

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

您可以通过ON子句中的列有效“查找”:[MailEnabled], [Active],并且您可以将它们包含在select中,而无需额外成本。

您也能在不增加成本[EmployeeID], [DisplayName], [Email]来选择你的INCLUDE子句中的列 - 但是搜索(过滤,连接,查找)他们不会那么快

0

只需要第一个索引。

如果你有两个建议,这是因为一个查询需要所有三个包含列('覆盖索引')满足查询,而无需查询主聚簇索引以获取列......并且第二个查询只需要其中的两个。

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

尝试创建两者都会创建大量重复数据,并且会减慢插入次数并且无法正确使用更多磁盘空间。

相关问题