【问题标题】:Why does this sql query do a key lookup?为什么这个 sql 查询会进行键查找?
【发布时间】:2011-03-11 08:00:39
【问题描述】:

我有一个带有一堆索引的表用户。其中之一是 AccountIdentifier 列上的唯一索引。

既然这是一个唯一索引,为什么除了索引查找之外还需要一个键查找?索引查找工具提示报告仅返回一条记录。我还尝试将索引转换为“唯一键”类型。

alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png

【问题讨论】:

  • 顺便说一句:永远不要在生产系统上使用SELECT * - 从不 - 没有例外。这是一种不好的做法......

标签: sql sql-server query-optimization sql-execution-plan


【解决方案1】:

有关键查找/书签查找的更多背景信息,请参阅这些文章和博客文章:

【讨论】:

    【解决方案2】:

    因为它选择了*

    它使用非聚集索引来定位行,但随后需要去获取数据以返回。

    为避免bookmark lookup,您需要将非聚集索引设为覆盖索引(理想情况下,通过减少选择列表中的列数,但也可以通过将新列添加到索引本身或作为included columns

    如果表上有聚集索引,则非聚集索引中的行定位器将包含聚集索引键,因此它不需要书签查找来满足对 AccountIdentifier 和聚集索引列的查询。

    【讨论】:

    • 我做了一些实验。因此,似乎选择不在使用的索引中的任何内容都会导致键查找。这是有道理的。
    • @BC - 基本上是的,但如果你有一个聚集索引,你可以考虑自动包含这些列。
    【解决方案3】:

    key lookup 并不是“查找key”,而是“根据key查找行”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多