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

sup*_*er9 1 sql t-sql sql-server indexing

这两个覆盖的索引之间有什么区别吗?

  1. 具有FriendID和UserID的复合索引
  2. 将FriendID和UserID作为包含列的索引

单独的MS SQL Server相关点.如果上述问题的答案是"没有区别",是我还是数据库引擎优化顾问(DTA)总是对包含的列疯狂?

Rem*_*anu 9

是的,他们是不同的.

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

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

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