【问题标题】:A covered index formed by a composite index or index with included columns由复合索引或包含列的索引形成的覆盖索引
【发布时间】:2009-10-19 16:49:12
【问题描述】:

这两个涵盖的索引有什么区别吗?

  1. 同时包含 FriendID 和 UserID 的复合索引
  2. 以 FriendID 和 UserID 作为包含列的索引

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

【问题讨论】:

    标签: sql sql-server tsql indexing


    【解决方案1】:

    是的,它们是不同的。

    • (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)。

    【讨论】:

    • 那么,当您可以使用包含列实现相同的结果同时在非叶页面上保持更窄的索引时,使用复合索引有什么好处?
    • 如果您需要 B 在 A 领带上的第二个订单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2011-05-09
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多