在相同的键但不同的INCLUDE列上合并SQL Server索引

时间:2015-12-11 10:25:30

标签: sql-server tsql indexing

使用Brent Ozar的sp_BlitzIndex从具有共同布局但不同最终用户的多个SQL Server数据库中突出显示缺失的索引( Indexaphobia:高值缺失索引)。

一些建议涉及INCLUDE(...)的索引,我不确定我是否可以将这些潜在索引中的几个组合在一起 - 例如我说有几组人(tblPeople)被查询以略微不同的方式产生了以下建议;

CREATE INDEX [ix_tblPeople_ZipCode] ON [dbo].[tblPeople] ([ZipCode]);

CREATE INDEX [ix_tblPeople_ZipCode_include_A] ON [dbo].[tblPeople] ([ZipCode]) INCLUDE ([FirstName]);

CREATE INDEX [ix_tblPeople_ZipCode_include_B] ON [dbo].[tblPeople] ([ZipCode]) INCLUDE ([LastName]);

CREATE INDEX [ix_tblPeople_ZipCode_include_C] ON [dbo].[tblPeople] ([ZipCode]) INCLUDE ([BusinessName]);

将这些组合成一个索引,INCLUDE所有这些列对所有三个场景都有用,还是有更好的方法?

CREATE INDEX [ix_tblPeople_ZipCode_include] ON [dbo].[tblPeople] ([ZipCode]) INCLUDE ([BusinessName], [LastName], [FirstName]);

2 个答案:

答案 0 :(得分:0)

是的,这可能是一个好主意 - 更少的索引意味着当您插入,更新或删除行时,维护开销更少。

由于这些列仅仅是包含在叶级别,因此对索引的导航结构也没有负面影响。

答案 1 :(得分:0)

这取决于。

如果您的查询有像

这样的where子句
where  firstname  like 'John'
and    lastname   like 'Smith'
and    businesName like 'StackOverflow'
and    zipCode    like '12345'

然后将不使用包含的列 - 仅使用索引列(zipCode)来过滤结果。

另见this answer