我正在尝试调整一些存储过程并对索引有疑问。我使用了调优顾问,他们推荐了两个索引,两个索引都在同一个表中。问题是一个索引用于一列,另一个索引用于多个列,其中包含与第一列相同的列。我的问题是为什么和有什么区别?
CREATE NONCLUSTERED INDEX [_dta_index_Table1_5_2079723603__K23_K17_K13_K12_K2_K10_K22_K14_K19_K20_K9_K11_5_6_7_15_18]
ON [dbo].[Table1] (
[EfctvEndDate] ASC,
[StuLangCodeKey] ASC,
[StuBirCntryCodeKey] ASC,
[StuBirStOrProvncCodeKey] ASC,
[StuKey] ASC,
[GndrCodeKey] ASC,
[EfctvStartDate] ASC,
[StuHspncEnctyIndctr] ASC,
[StuEnctyMsngIndctr] ASC,
[StuRaceMsngIndctr] ASC,
[StuBirDate] ASC,
[StuBirCityName] ASC
) INCLUDE (
[StuFstNameLgl],
[StuLastOrSrnmLgl],
[StuMdlNameLgl],
[StuIneligSnorImgrntIndctr],
[StuExpctdGrdtngClYear]
) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
ON [PRIMARY] go
CREATE NONCLUSTERED INDEX [_dta_index_Table1_5_2079723603__K23]
ON [dbo].[Table1] (
[EfctvEndDate] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
ON [PRIMARY]
答案 0 :(得分:2)
“独立”EfctvEndDate索引虽然在其他索引中功能可用,但会小得多,因此效率更高(关于所需的读取次数,它的能力是缓存,保留在缓存等等。)。
这当然在很大程度上取决于使用模式等。但是,总的来说,将多个明显多余的索引作为敏感方法是非常合理的。
索引“重复”的缺点主要是(并且可能是从更大到更小的影响的顺序):
答案 1 :(得分:2)
如上所述,如果单列是多列索引中定义的第一列:它并不总是正确,或者查询工作负载随时间发生了变化。如果多列索引有用且正在使用,则可以删除单列索引。但是,配置文件并检查索引使用情况报告。
如果没有,那么它适用于不同的查询。我注意到DTA喜欢做的一件事是创建一个索引,它本质上是整个表的副本,特别是在ORM发出查询工作负载的情况下。
与此案例和所有其他案例一样,您需要进行分析以确定与“正常”查询工作负载相关的任何索引的有效性。