Sql-Server

參數嗅探即使在禁用後也會發生嗎?

  • June 15, 2021

我對 EF linq 查詢有一個非常奇怪的問題,該查詢執行動態 sql,如下所示:

EXEC sp_executesql N'select 1 from X',N'@parameter1 int',@parameter1 = 123

查詢需要永遠完成(一個多小時……)所以我的第一個測試是手動執行它並給出option (recompile)提示,它立即執行,所以對我來說這將是參數嗅探的情況,但奇怪的是我做了清除整個實例計劃記憶體的測試,我不斷得到可怕的估計,查詢永遠需要,甚至禁用 SQL Server 上的參數嗅探我一直遇到同樣的問題。

不確定它是否可能以某種方式相關,但查詢正在使用視圖並且視圖正在使用該FOR XML PATH函式來提取一些數據,所以這可能會影響估計?

關於可能導致這種奇怪行為的任何想法?這是計劃的摘錄,即使在更新統計資訊並從記憶體中清除計劃之後,我仍然遇到同樣的問題,唯一解決問題的是重新編譯提示

SSMS 中的執行計劃截圖

禁用參數嗅探選項重新編譯不同。禁用參數嗅探意味著優化器“不知道”參數的值,並且使用統計中的密度或硬編碼值來進行選擇性(對於 BETWEEN 等,例如 30% - 無論每個運算符的實際百分比是多少) .

要回答標題中的問題:不,使用數據庫範圍配置選項禁用參數嗅探後,您將不會獲得參數嗅探:

ALTER DATABASE SCOPED CONFIGURATION 
SET PARAMETER_SNIFFING = OFF;

然而,這並不意味著你會得到一個好的執行計劃。這意味著 SQL Server 將使用密度向量或固定的“猜測”,具體取決於所使用的運算符(等於、大於、介於等),而不是嗅探參數並根據該值編譯計劃。可以在 Erik Darling 的文章Yet Another Post About Local Variables中找到有關這方面的很多詳細資訊。

您提到在清除整個實例的計劃記憶體後仍然會得到錯誤的計劃,但是您會得到一個帶有OPTION (RECOMPILE)查詢提示的好計劃。最可能的原因是您的查詢獲得了帶有提示的參數嵌入優化的額外優勢。這在 Paul White 的文章Parameter Sniffing, Embedding, and the RECOMPILE Options中有詳細描述:

在查詢解析期間,查詢參數被替換為文字常量值。

解析器能夠進行令人驚訝的複雜簡化,隨後的查詢優化可能會進一步細化。

根據您在問題中包含的計劃片段的螢幕截圖,很難確切地說替換過程對您有什麼好處。如果您想要關於如何在沒有 的情況下改進查詢的建議*,* OPTION (RECOMPILE)您可能想問另一個問題,其中包含有關架構、索引、執行計劃等的更多詳細資訊(根據詢問查詢性能問題)。

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