SQL重叠和多列索引

时间:2010-03-08 23:44:25

标签: sql indexing performance sql-execution-plan

我正在尝试调整一些存储过程并对索引有疑问。我使用了调优顾问,他们推荐了两个索引,两个索引都在同一个表中。问题是一个索引用于一列,另一个索引用于多个列,其中包含与第一列相同的列。我的问题是为什么和有什么区别?

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]

2 个答案:

答案 0 :(得分:2)

“独立”EfctvEndDate索引虽然在其他索引中功能可用,但会小得多,因此效率更高(关于所需的读取次数,它的能力是缓存,保留在缓存等等。)。

这当然在很大程度上取决于使用模式等。但是,总的来说,将多个明显多余的索引作为敏感方法是非常合理的。

索引“重复”的缺点主要是(并且可能是从更大到更小的影响的顺序):

  • INSERT / UPDATE / DELETE对基础表的查询,会产生性能开销以维护额外的索引。
  • 竞争缓存使用情况
  • [非常轻微]生成查询计划的时间较长。
  • 存储开销(通常是非问题;确实会增加备份时间,但是......)。
因此,必须估计SELECT查询的改进性能是否可以从额外的索引中获益,从而抵消了上面列出的缺点。数据库性能调优通常是个案练习......

答案 1 :(得分:2)

如上所述,如果单列是多列索引中定义的第一列:它并不总是正确,或者查询工作负载随时间发生了变化。如果多列索引有用且正在使用,则可以删除单列索引。但是,配置文件并检查索引使用情况报告。

如果没有,那么它适用于不同的查询。我注意到DTA喜欢做的一件事是创建一个索引,它本质上是整个表的副本,特别是在ORM发出查询工作负载的情况下。

与此案例和所有其他案例一样,您需要进行分析以确定与“正常”查询工作负载相关的任何索引的有效性。