4

使用SQL Server 2008,我有一個簡單的存儲過程,其內容是你是否總是期望參數嗅探引起的問題?

DELETE FROM [ABC].[dbo].[LookUpPermissions] 
WHERE Code = @Code 

在最近的代碼審查,DBA說我應該「增加參數嗅探」,我相信意味着我應該考慮參數嗅探。我從來沒有這樣做過,我沒有任何性能問題與查詢,所以我認爲這是沒有必要的。

雖然我認爲答案可能是用戶偏好,但是最好的做法是解釋參數嗅探?存儲過程是否需要在小數據集上調用,不常使用並且沒有性能問題?


編輯
這是僅適用於使用的參數WHERE子句,或例如,你可能需要在INSERT語句考慮到所有的參數?

+1

[相關 - 如果你總是使用'OPTIMIZE FOR UNKNOWN'](http://stackoverflow.com/q/4376313/73226) – 2011-12-22 20:10:28

回答

3

簡單地搜索這樣的單個值不應該容易受到參數嗅探的影響。當傳遞的參數產生大不相同的結果並且最佳執行計劃與先前產生的結果不同時,更關心的是問題。

作爲示例,請考慮查找日期列在@start_date和@end_date之間的行。調用日期範圍爲2天的過程可能會產生/緩存對於1年的日期範圍不是最佳的執行計劃。

+0

這不取決於'Code'是否是'LookUpPermissions'的PK,或者「LookUpPermissions」是一個具有100000個條目的細節表,其中99%具有單個「代碼」值,另一個1%具有各種其他「代碼」?在第二種情況下,我會期待與您的日期情況相同的行爲 - 「代碼」值的初始選擇可能會影響查詢計劃。 – Tao 2011-12-27 14:42:27

+0

thx。對where子句中沒有使用的參數有何評論? – earthling 2012-01-04 22:52:12

+0

@senloe在INSERT('INSERT INTO MyTable(Col1,Col2)VALUES(@ p1,@ p2)')中使用的參數對生成的執行計劃絕對沒有影響,所以在這種情況下不會有參數嗅探的機會。 – 2012-01-04 22:55:45

-1

參數嗅探是Microsoft用於優化SQL查詢的另一種內置「smarty thingy」(記住內聯拼寫/語法檢查)。通過嗅探輸入參數,SQL Server可以最有效地猜測哪個緩存查詢計劃是最好的計劃。它並不總是做出正確的選擇。

Read this for information on how to trick SQL into not using pramater sniffing

+3

他們並沒有要求對什麼參數嗅探進行模糊解釋,或者如何採取預防措施以避免它。當**採取這些預防措施時,他們問**。 – 2011-12-27 20:52:33