Sql-Server

可變嗅探?

  • January 31, 2017

這可能很愚蠢,感覺就像我要回去嘗試理解基礎知識。

所以我創建了一個如下所示的測試表並在其上創建了一個聚集索引

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 = 標量運算符( (216) ) 在此處輸入圖像描述

從估計的行數可以看出,第一個是 3.2511,它來自密度向量,第二個是 7 的估計行數來自直方圖。

那麼當我們重新編譯即席查詢時,SQL Server 可以嗅探變數是真的還是我不理解的東西?

此行為是查詢提示主題中的文件:

編譯查詢計劃時,RECOMPILE 查詢提示使用查詢中任何局部變數的目前值,如果查詢在儲存過程中,則將目前值傳遞給任何參數。

引用自:https://dba.stackexchange.com/questions/162716