索引交集是否适用于包含的列?

Sim*_*wsi 2 index sql-server sql-server-2008-r2 index-tuning

报告设计者问我是否可以向表添加新索引以加快特定报告的速度。索引将位于单个列 CreatedDate 上,但会包含列。

表上已经有五个索引,我想避免为特定的报告或查询创建单独的索引。但是,我认为单列索引在索引交叉中可能很有用,特别是在可能用于多个查询的列上,例如 CreatedDate。

为了帮助我做出决定,我想知道的是,包含列的索引是否可以用于索引交叉,或者包含列是否会阻止索引用于索引交叉。

我试过用谷歌搜索这个问题,但没有找到任何关于包含的列对索引交集的影响的信息。

Han*_*non 5

包含的列不会阻止索引用于任何目的。

查询优化器将选择对正在编译的查询最有效的最佳索引(或可能是表扫描)。保持索引尽可能小,同时仍然提供所需的功能。根据联机丛书, INCLUDEd 列不会影响查询优化器严格根据大小选择索引,但是,如果任何给定的索引具有查询所需的所有列,无论是作为键列还是包含列,都将优先考虑该索引。

由于查询优化器是一个相当不透明的野兽,您很可能需要测试建议的索引以查看它是否被使用,以及由此产生的对 INSERT、UPDATE 和 DELETE 的影响。

  • +1 测试必不可少。围绕索引联合和交集的一些启发式方法意味着 QO 经常错过此策略([除非使用`FORCESEEK`](http://msdn.microsoft.com/en-us/library/bb510478.aspx))。OTOH 在 DW 星型连接查询中有 [对索引交集的扩展支持](http://sqlperformance.com/2014/01/sql-plan/starjoininfo-in-execution-plans)。 (3认同)