Execution-Plan

為什麼強制參數化下有多個查詢計劃?

  • December 14, 2018

我在查詢儲存中的 Azure SQL 數據庫(強制參數化 = FORCED、參數嗅探 = ON 和查詢優化器修復 = ON)中看到以下查詢:

delete from [CMS_WebFarmTask] 
where [TaskIsAnonymous] = @0 
and [TaskID] not in ( select [TaskID] from [CMS_WebFarmServerTask] ) 
and [TaskCreated] < dateadd ( minute , @1 , getdate ( ) )

它有大量計劃(最後一小時有 17 個),儘管兩個參數都是整數,每個計劃中的值都相同:

       <ParameterList>
         <ColumnReference Column="@1" ParameterDataType="int" ParameterCompiledValue="(-3)" />
         <ColumnReference Column="@0" ParameterDataType="int" ParameterCompiledValue="(0)" />
       </ParameterList>

查詢儲存螢幕截圖

為什麼不只使用一個計劃?

強制參數化<>強制單一計劃。

但是,查詢儲存確實具有強制執行單個計劃的功能,如果這是您所追求的。您可以在螢幕截圖中看到它的按鈕。

但是,如果您更關心為什麼首先要獲得多個計劃,那麼您應該首先確保每次都執行相同的查詢。在您的情況下,由於您使用GETDATE()的是 ,因此每次執行時查詢實際上都是不同的,因此我不希望它僅基於此產生相同的計劃。

您還需要意識到基礎表的統計資訊也可能隨著時間而變化,這會嚴重影響計劃估計。還有很多其他因素在其中起作用——本文深入探討了執行計劃的內容以及可能影響它們的因素。數據庫是一個活生生的東西,計劃更改不應該本質上被視為一件壞事,除非它會導致明顯的性能問題。

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