同一查詢的查詢儲存中的多個計劃(有/沒有缺失索引)
我是關於查詢儲存的新手,並且在理解我所看到的內容時遇到了一些問題。
我們有一個第三方應用程序(在 SQL Server 2016 Enterprise SP1 CU7 上執行)使用查詢提示
KEEP PLAN
和KEEPFIXED PLAN
. 當我在查詢儲存中進行一些監控時,我看到一些查詢在計劃摘要視窗中有多個計劃 ID。為什麼使用
KEEP PLAN
並KEEPFIXED PLAN
具有多個計劃的查詢(有時完全不同,有時相同)?第二個問題,如果有看起來完全一樣的計劃(相同的物理運算符,相同的集合選項,相同的查詢雜湊),一個計劃怎麼可能缺少索引而第二個計劃沒有?
我將從第二個問題開始
計劃 2 的“缺失索引”建議的原因是計算的子樹成本 傳遞的參數導致子樹成本(嵌套循環連接上的右鍵點擊/懸停)比計劃 1 高 10 倍,它是因為估計的行數是 149,而不是 16。建議缺少的是覆蓋索引,因此它不必進行 149 次鍵查找來從索引中獲取缺失值。對於計劃 1,可以進行 16 次鍵查找
你正在經歷的是 Erland Sommaskog 所說的“道德上等價的計劃”
Kendra Little 在這篇文章中解釋了它https://sqlworkbooks.com/2018/03/what-is-a-morally-equivalent-execution-plan-and-why-is-it-good/ 使用 Query store 的特性來強制計劃,但我相信使用 KEEPFIXED PLAN 時是一樣的
至於為什麼存在針對同一查詢的多個計劃。許多原因包括重新啟動、由於記憶體壓力而清除記憶體、更改查詢引用的表的結構或架構。
這將導致重新編譯計劃
通常也會更新統計資訊,但由於您有 KEEPFIXED PLAN,所以情況並非如此。
擁有 KEEPFIXED PLAN 可能會導致性能下降,因為隨著數據的變化,統計數據會發生變化,最佳計劃可能會有所不同,但 KEEPFIXED PLAN 始終強制執行相同的計劃。
我猜,但設置
OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN)
用於所有查詢?那麼 DBA 必須監控是否使用了最優計劃(如果自計劃創建以來數據分佈發生了很大變化)
一個額外的評論。不需要在提示中同時包含 KEEP PLAN 和 KEEPFIXED PLAN。KEEPFIXED PLAN 推翻了 KEEP PLAN。KEEP PLAN,就統計失效而言,禁用“6 行”規則。由於統計數據完全更改,KEEPFIXED PLAN 會禁用重新編譯。