【发布时间】:2014-11-12 16:44:32
【问题描述】:
我正在运行一个包含类似于以下查询的 SP:
DECLARE my_cursor CURSOR FOR
SELECT TOP 5000 id
FROM Table
WHERE ColA= 1 AND ColB= ColC
我创建了一个非聚集索引,其中 id 是索引键列,包括 ColA、ColB 和 ColC。
现在,当我单独运行上述查询(不带光标行)时,我可以看到只执行了索引扫描(使用我创建的索引)。这很好,符合预期。
但是,当我运行 SP 并查看执行计划时,我惊讶地发现对于上面的查询,它执行了索引扫描和键查找(这也需要大量时间)。
我的理解是,只有在需要索引中未涵盖的一些额外列时,键查找才会发挥作用。但显然我已经包含了所有必要的列。
有人对此有解释吗?谢谢!
【问题讨论】:
-
您运行的是什么版本的 SQL Server?
-
我在 SQL 2012 中重新创建了您的确切示例,它只为我运行索引扫描。 ColB 和 ColC 中比较的列类型是什么?
-
ColA 是 tinyint,ColB 和 ColC 是 int。 id 是 Table 的 bigint 和 PK。
-
当您右键单击 Key Lookup 并点击 Properties 时,Key Lookup 的输出列表中有什么?
-
输出列表显示 Chk1002。
标签: sql sql-server database stored-procedures