这可能很愚蠢,感觉就像我要回去尝试理解基础知识一样。
所以我创建了一个如下所示的测试表并在其上创建了一个聚簇索引
create table test( c1 int)
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 1
SET @Upper = 10000
while 1=1
begin
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
insert into test SELECT @Random
end
create clustered index cidx on test(c1)
现在我运行下面的查询和实际的执行计划
DECLARE @Min INT
SET @Min = 216 --selected this cause this was a histogram step
select * from test where c1 = @Min
select * from test where c1 = @Min option(recompile)
因此,对于第一个查询,行为符合预期,估计的行数是根据密度向量计算的。
搜索谓词 - 搜索键1:前缀:[db].[dbo].[test].c1 = 标量运算符([@Min])
但是对于第二个查询,sql server 似乎可以使用选项(重新编译)嗅探值。我认为即使我们使用选项重新编译,SQL Server 也无法嗅探变量?
查找谓词 - 查找键1:前缀:[DB].[dbo].[test].c1 = Scalar Operator( (216) )
因此,正如您从估计的行数中看到的那样,第一个是 3.2511,它来自密度向量,第二个是 7 的估计行数来自直方图。
那么,当我们重新编译即席查询时,SQL Server 真的可以嗅探变量吗?还是我不明白?
此行为在查询提示主题中有记录: