【问题标题】:Nonclustered index uses key into clustered index instead of address?非聚集索引使用聚集索引的键而不是地址?
【发布时间】:2013-05-19 19:19:52
【问题描述】:

documentation for SQL server 2008 R2 中声明:

宽键是多列或多列大列的组合。来自聚集索引的键值被所有非聚集索引用作查找键。在同一张表上定义的任何非聚集索引都会显着增大,因为非聚集索引条目包含聚集键以及为该非聚集索引定义的键列。

这是否意味着,当使用非聚集索引进行搜索时,聚集索引也是搜索?我最初认为非聚集索引直接包含页面(块)的地址及其引用的行。从上面的文字来看,它似乎只包含非聚集索引中的键而不是地址。

谁能解释一下?

【问题讨论】:

    标签: database sql-server-2008-r2 indexing clustered-index non-clustered-index


    【解决方案1】:

    是的,就是这样:

    • SQL Server 在非聚集索引中搜索您的搜索值
    • 如果找到匹配项,则在该索引条目中,还有 聚簇键(构成聚簇索引的一列或多列)
    • 现在使用该聚集键执行键查找(通常也称为书签查找) - 在聚集索引中搜索给定的值
    • 当找到该项目时,聚集索引导航结构的叶级的整个数据记录都存在并且可以返回

    SQL Server 会这样做,因为使用物理地址真的很糟糕:

    • 如果发生页面拆分,所有移动到新页面的条目都会更新
    • 对于所有这些条目,所有非聚集索引也必须更新

    这对性能真的很不利。

    这就是为什么在SELECT(而不是总是SELECT *)中使用有限的列列表是有益的原因之一,甚至可能在非聚集索引中包含一些额外的列(使其成为覆盖指数)。这样,您就可以避免不必要且昂贵的书签查找。

    因为集群键包含在每个非聚集索引中,所以它是一个 和窄键非常重要 - 最好是 INT IDENTITY 或类似的东西 - 而不是很大结构体;集群键是 SQL Server 中复制最多的数据结构,应该尽可能小。

    这些书签查找相对昂贵的事实也是查询优化器可能会在您选择大量行后立即选择索引扫描的原因之一 - 有时,仅扫描聚集索引可能是比进行大量密钥查找要便宜。

    【讨论】:

    • 感谢您的确认。你能不能提供信息为什么会这样?直接有地址不是更快吗?我知道在聚集索引中搜索速度很快,检索数据也很快,但是为什么不节省在聚集索引中搜索的时间,而不是直接访问数据呢?还是我在这里遗漏了什么?
    • @OndraPeterka:拥有一个物理地址只会有更多的缺点,并且在页面拆分的情况下需要更多的努力。
    猜你喜欢
    • 2020-08-04
    • 2013-08-07
    • 1970-01-01
    • 2021-01-14
    • 2012-12-21
    • 1970-01-01
    • 2011-04-05
    • 2011-10-08
    相关资源
    最近更新 更多