小编Ada*_*dam的帖子

使用大于 WHERE 子句时的聚集索引扫描

我有下表

create table t1(
col1 varchar(255) NOT NULL,
col2 varchar(255) NULL,
col3 bigint NULL,
CONSTRAINT PK_t1 PRIMARY KEY CLUSTERED
 (
   col1 asc
 )
)

CREATE NONCLUSTERED INDEX I_col3 ON t1(col3 desc)
Run Code Online (Sandbox Code Playgroud)

这个表有大约 10000 行,col2 总是被填充,col3 有不同百分比的非空行。

我正在运行以下查询

DECLARE @number bigint
SET @number = 123456
SELECT col1, col2 FROM t1
WHERE col3 > @number
Run Code Online (Sandbox Code Playgroud)

SQL 总是使用聚集索引扫描生成执行计划。

现在,如果我将查询作为临时查询运行,SQL 会使用键查找对 I_col3 进行索引查找

SELECT col1, col2 FROM t1
WHERE col3 > 123456
Run Code Online (Sandbox Code Playgroud)

WHERE 子句中传递的值会导致返回少量行(例如 3)

运行即席查询时,执行计划将估计行数显示为 3.32。但是,当我运行参数化查询时,它显示了 2796 行估计值。

如果我向临时查询添加索引提示,它仍会显示 2796 条估计行(不是我希望这会改变),但它确实会进行索引查找。在比较临时和参数化查询之间的逻辑读取数时,参数化查询:扫描计数 1,逻辑读取 89,物理读取 …

sql-server execution-plan sql-server-2014

5
推荐指数
1
解决办法
1085
查看次数