【问题标题】:Why doesn't this remove the Key Lookup from the SQL Server query?为什么这不会从 SQL Server 查询中删除键查找?
【发布时间】:2014-12-10 17:29:53
【问题描述】:

我在 SQL Server 查询中发生了键查找。 SQL Server 执行计划说 Key Lookup 的对象是一个索引,Table1.PK_TABLE1。输出列表包括表 1 中的另外两列。所以我决定创建一个覆盖索引,如下所示:

CREATE INDEX [IX_Table1_CoveringIndex] ON Table1(Column2, Column3)

当我运行查询时,同样的 Key Lookup 仍在发生。

有什么想法吗?谢谢。

【问题讨论】:

  • 你应该发布你的查询和你的实际执行计划。

标签: sql-server indexing query-optimization


【解决方案1】:

根据定义,您的索引没有覆盖,因为它需要返回聚集索引来获取非聚集索引中不存在的信息。由于您正在查看执行计划,因此键查找运算符返回哪些列?您需要将这些列作为索引列或包含列放入索引中以避免键查找。

【讨论】:

    【解决方案2】:

    根据您的描述,您的覆盖索引听起来不完整。您的索引需要包含查找所需的所有列以及满足返回结果所需的列。

    所以,对于这样的查询:

    SELECT column2, column3
        FROM Table1
        WHERE column1 = @SomeParam;
    

    你想要“覆盖”它:

    CREATE INDEX [IX_Table1_CoveringIndex] ON Table1(Column1, column2, column3);
    

    或者甚至可以使用包含的列:

    CREATE INDEX [IX_Table1_CoveringIndex] ON Table1(Column1) INCLUDE (column2, column3);
    

    【讨论】:

    • 感谢您的建议。我尝试了不止一次,但我仍然看到 Key Lookup。看起来很奇怪。
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多