SQL Server非集群索引 - 包含值
我对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
这取决于你在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
子句中的列 - 但是搜索(过滤,连接,查找)他们不会那么快
只需要第一个索引。
如果你有两个建议,这是因为一个查询需要所有三个包含列('覆盖索引')满足查询,而无需查询主聚簇索引以获取列......并且第二个查询只需要其中的两个。
一个包含所有三个列的索引满足两个查询。
尝试创建两者都会创建大量重复数据,并且会减慢插入次数并且无法正确使用更多磁盘空间。
什么类型,并在值范围MailEnabled和Active? –