使用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]);
答案 0 :(得分:0)
是的,这可能是一个好主意 - 更少的索引意味着当您插入,更新或删除行时,维护开销更少。
由于这些列仅仅是包含在叶级别,因此对索引的导航结构也没有负面影响。
答案 1 :(得分:0)
这取决于。
如果您的查询有像
这样的where子句where firstname like 'John'
and lastname like 'Smith'
and businesName like 'StackOverflow'
and zipCode like '12345'
然后将不使用包含的列 - 仅使用索引列(zipCode)来过滤结果。
另见this answer。