1

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

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]
4

2 回答 2

2

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

这当然很大程度上取决于使用模式等。但是,一般来说,拥有多个明显冗余的索引是一种敏感的方法是非常合理的。

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

  • 对基础表的 INSERT/UPDATE/DELETE 查询会产生性能开销来维护额外的索引。
  • 缓存使用竞争
  • [非常轻微] 生成查询计划的时间更长。
  • 存储开销(通常不是问题;但是确实会增加备份时间……)。

因此,必须估计可能受益于额外索引的 SELECT 查询的改进性能是否抵消了上面列出的缺点。数据库性能调优通常是逐案练习...

于 2010-03-08T23:53:14.847 回答
2

如果像上面的情况一样,单列是多列索引中定义的第一列:它并不总是正确的,或者查询工作量随着时间的推移而变化。如果多列索引是有益的并且正在使用,您可以删除单列索引。但是,分析并检查索引使用报告。

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

与这种情况和所有其他情况一样,重要的是您进行概要分析以确定任何索引相对于您的“正常”查询工作负载的有效性。

于 2010-03-08T23:55:27.457 回答