2011-05-24 23 views
2

我曾經看到有人建議將參數複製到本地變量以避免參數在存儲過程中嗅探。假設你有在SQL Server 2005中解決參數嗅探

CREATE PROCEDURE List_orders_3 @fromdate datetime AS 
DECLARE @fromdate_copy datetime 
SELECT @fromdate_copy = @fromdate 
SELECT * FROM Orders WHERE OrderDate > @fromdate_copy 

(我得到這個從http://www.sommarskog.se/query-plan-mysteries.html但我需要更多的細節,充分理解它)。

但是,這對於查詢計劃緩存和查詢計劃優化器實際做了什麼?如果優化器對@fromdate_copy沒有任何假設是真的,那爲什麼它不會緩存最有可能成爲全表掃描的計劃(因爲它不做任何假設,它怎麼會產生其他東西)?

這種技術基本上就像一個「沒有投入將運行良好,但沒有投入將運行非常可怕」?

回答

2

實際上,您需要爲您聲明的@fromdate_copy字段指定一個默認變量,以便當查詢引擎查看查詢本身時,它將計劃基於「硬編碼」值 - 但傳遞相反,當實際查詢被執行,它就會用值執行並切換..

根·亨德森(上師自己)很詳細解釋這一點:http://blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx

如果可以的話,他的閱讀書 - 它們提供了關於sql server內部信息的大量信息:http://www.amazon.com/Gurus-Guide-Server-Architecture-Internals/dp/0201700476/ref=pd_bxgy_b_text_c

我不確定他是否有爲新版本寫的東西,但一些基本原理沒有改變那麼多......

+0

不幸的是肯在2008年去世了。 – 2011-05-24 17:24:15

+0

僅供參考這是「參數掩蔽」 – gbn 2011-05-24 19:16:28

+0

rellly ... 我不知道 :( – 2011-05-24 23:31:35