合并类似指数?

Kev*_*ope 4 index sql-server

在查看我们的一些数据库时,过去我们可能有点急于从 DTA 或估计的查询计划中获取任何建议,因此我们有很多索引,其中许多索引与其他索引相似。我所说的“相似”是指它们具有相同的密钥,但包含不同或重叠的内容。以下是我将其描述为“相似”的 3 个索引的一些示例:

CREATE INDEX Index1 ON Table1 (Col1)

CREATE INDEX Index2 ON Table1 (Col1) INCLUDES (Col2)

CREATE INDEX Index3 ON Table1 (Col1) INCLUDES (Col3)

我的期望是,将这 3 个索引合并为 1 个索引(即CREATE INDEX Index4 ON Table1 (Col1) INCLUDES (Col2, Col3))将清理内容并改进表上的插入/更新/删除,而不会损害查询性能。准确吗?有没有比删除现有的相似索引然后创建新索引更好或更有效的方法来解决这个问题?

谢谢!

Bre*_*rey 8

合并重叠索引通常是一个很好的做法。

\n
    \n
  1. 由于每次插入的索引写入量减少,您将看到插入性能的提高。
  2. \n
  3. 删除速度会更快,因为需要删除的索引更少。
  4. \n
  5. 在大多数情况下,更新也会更快,具体取决于要更新的​​列。
  6. \n
  7. 由于数据重复减少,您消耗的磁盘空间也更少。
  8. \n
\n

仅这些点就可能有助于提高表的性能,因为这些锁的持有时间较短。较短锁的副作用还可能导致表选择性能的提高,因为它们不太可能遇到锁。

\n

此外,所包含列的顺序不会对性能产生影响,因为这些列未在索引中排序。换句话说,尝试从索引中读取 col3 的查询(其中 col3 是第一个包含的列)的执行效果与从索引中读取的结果相同,其中 col3 是第二个包含的列。

\n

在您提供的示例中,Index4 可能是用于合并初始 3 个索引的最佳索引。

\n

合并索引之前需要考虑的其他要点

\n
    \n
  1. 当您向索引添加更多列时,索引的大小就会增加,从而可能导致索引读取速度变慢。
  2. \n
  3. 查看正在合并的列的数据类型。
  4. \n
  5. 检查表和受影响索引的读/写模式。
  6. \n
  7. 查看更改之前和之后的查询计划。
  8. \n
\n

例如,如果索引 A 可能每分钟读取 1,000 次,并且具有很少的小列,例如 varchar(20)。索引 B 可以在报告期间每月读取一次,并且具有数据类型为 varchar(2000) 的列。在这种情况下,整合可能会对常规生产查询期间的整体性能产生负面影响,而对月度报告工作几乎没有好处。

\n

话虽如此,指数整合在大多数情况下仍然有意义。但这只是一个指导方针,而不是规则。在做出最终决定之前,您需要审查所有因素,并确定您在该场景中的目标是什么。Brent Ozar 经常建议遵循每个索引不超过 5 列、每个表不超过 5 个索引的准则。Ronaldo实际上在Brent Ozer的评论中链接到一篇关于SQL Server 索引调优技巧:识别重叠的好文章

\n