SQL 服务器:没有聚集索引的键查找
SQL Server: Key Lookup without Clustered Index
我有一个名为 Scan
的 table,它只有两列:id (int)
和 a (char)
。
它开始时没有任何索引。所以我在
之后创建了一个非聚集索引 link
CREATE INDEX ix_id ON scan(id ASC)
所以我运行这个select:
SELECT id, a
FROM Scan
WHERE id = 1
这是执行计划:
如果我的 table 没有任何聚集索引,为什么我会得到一个键查找(聚集)?
非聚集索引的叶节点只包含键列,所以除了键列之外的任何内容都被选中(在你的情况下它是a
),然后它需要执行Rid/key查找从 heap/clustered index
中提取数据
使用覆盖索引避免键查找
CREATE INDEX ix_id ON scan(id ASC) include (a)
通过这种方式,列 a
也将与键列一起存储在您的索引中,因此将避免键查找
Why did I get a Key Lookup (clustered) if my table doesn't have any
clustered index?
你没有。这大概是 SQL Operations Studio 使用的 html-query-plan 库中的错误。
Paste The Plan 网站 (example) 上也出现了同样的问题。
如您所知(因为您找到了!)错误报告 is here。
我有一个名为 Scan
的 table,它只有两列:id (int)
和 a (char)
。
它开始时没有任何索引。所以我在
之后创建了一个非聚集索引 linkCREATE INDEX ix_id ON scan(id ASC)
所以我运行这个select:
SELECT id, a
FROM Scan
WHERE id = 1
这是执行计划:
如果我的 table 没有任何聚集索引,为什么我会得到一个键查找(聚集)?
非聚集索引的叶节点只包含键列,所以除了键列之外的任何内容都被选中(在你的情况下它是a
),然后它需要执行Rid/key查找从 heap/clustered index
使用覆盖索引避免键查找
CREATE INDEX ix_id ON scan(id ASC) include (a)
通过这种方式,列 a
也将与键列一起存储在您的索引中,因此将避免键查找
Why did I get a Key Lookup (clustered) if my table doesn't have any clustered index?
你没有。这大概是 SQL Operations Studio 使用的 html-query-plan 库中的错误。
Paste The Plan 网站 (example) 上也出现了同样的问题。
如您所知(因为您找到了!)错误报告 is here。