Sql-Server
可變嗅探?
這可能很愚蠢,感覺就像我要回去嘗試理解基礎知識。
所以我創建了一個如下所示的測試表並在其上創建了一個聚集索引
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 查詢提示使用查詢中任何局部變數的目前值,如果查詢在儲存過程中,則將目前值傳遞給任何參數。