由包含列的复合索引或索引形成的覆盖索引

时间:2009-10-19 16:49:13

标签: sql sql-server tsql indexing

这两个覆盖的索引之间是否存在差异?

  1. 包含FriendID和UserID
  2. 的综合索引
  3. 包含FriendID和UserID作为包含列的索引
  4. 单独的MS SQL Server相关点。如果上述问题的答案是“没有区别”,那么我或者数据库引擎优化顾问(DTA)是否总是对所包含的列感到疯狂?

1 个答案:

答案 0 :(得分:9)

是的,他们是不同的。

  • (A,B)上的索引将包含A,B组合作为索引键,这意味着它显示在每个非叶页上。
  • (A)中的索引包括(B)将仅包含A作为索引键,因此B将在叶页上仅存在 ,而非叶页将仅包含A. / LI>

差异意味着(A,B)上的索引更宽,(A)上的索引包括(B),因此它们包含更多非叶页,生成更大的索引(更多页),更多IO,因此效率更低

但是,索引(A,B)将始终覆盖索引(A)包括(B)。因此,如果您已经在(A,B)上有索引,并且Tunning Advisor建议在(A)上包含(B)的新索引,那么某些方法很可疑。无论是使用DTA建议,还是对现有索引的分析。没有冒犯,但在这样的情况下,我倾向于相信DTA而非人类分析,所以请确保您的索引已经涵盖了DTA建议,包括订单和过滤器(针对SQL 2008)。