我有下表
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,物理读取 …