我有一個包含2000萬條目的「my_table」表。該id列被編入索引。如果我做了以下查詢,它只需要少於1個SEK。SQL Server - 變量替換緩慢
SELECT * FROM my_table WHERE id='asdf'
如果我在where子句中執行相同的查詢,但使用臨時變量。
declare @ID nvarchar(4)
set @ID = N'asdf'
SELECT * FROM my_table WHERE [email protected]
它需要~14 sek。
select <- Clustered Index Scan
執行計劃與恆:用臨時變量
執行計劃
select <- Nested Loops <- Index Seek (Non clustered)
<- Key Lookup (Clustered)
第一個問題: 爲什麼第一次查詢到的是更長的時間來執行呢?
SQL Server事件探查器告訴我,第一個查詢確實〜800000次讀取(cpu 5258),而第二個查詢確實讀取了25次(cpu 0)。
第二個問題: 如果我申請OPTION(RECOMPILE)的第一個查詢,執行將運行速度快和執行計劃就像是第二,但我不明白爲什麼。
變量是否針對搜索中的每個條目進行了評估?
你一直是參數嗅探的受害者。 –
@ AllanS.Hansen我不認爲這是完全正確的。他是缺少參數嗅探的受害者,因爲變量的值在編譯時並不知道(除非查詢稍後會受到語句級別的重新編譯,那麼實際上會知道該值)。 –
@ AllanS.Hansen - 在SQL Server中嗅探局部變量[從未發生](http://dba.stackexchange.com/a/33727/3690),沒有顯式的'RECOMPILE'提示,即使語句本身在變量被分配。 –