Sql-Server

2014 SP1 + CU4 升級後的基數估計問題

  • May 1, 2016

我們最近從 SQL Server 2008R2 升級到 SQL Server 2014 SP1 + CU4。

幾週後,執行計劃出現了無法正確估計行數的問題。問題一度變得如此嚴重,以至於決定通過再次啟用9481跟踪標誌和更新統計資訊來恢復到舊的基數估計器。當我說“變得如此糟糕”時,我指的是在某些情況下查詢的執行時間增加了 10 倍。

使用 traceflag 9481已經解決了問題,但這不是解決方案嗎?

搜尋 Google 顯示一些採用舊的基數估計器路線,而另一些則使用23124199的組合來使用新的估計器。

那麼在從 2008R2 升級到 2014 之後,我們應該採取哪些跟踪標誌(如果有)和其他步驟的組合?

謝謝,克雷格

4月26日上午9點更新

4199 跟踪標誌不會打開新的基數估計器。我不得不改用 2312 跟踪標誌。

在此處輸入圖像描述

使用 4199 traceflag,版本仍然是 70。Chris Wood 的回答讓我想起了Brent Ozar 的一篇文章,我也曾在某個時候讀過。仍在等待執行時間是否有所改善。

根據我在此類問題上的經驗以及在This Blogs.msdn 文章中提到的

您需要應用 SP1,但還必須啟用跟踪標誌 4199 才能啟動修復。SQL Server 2014 Service Pack 1 對新的 Cardinality Estimator(新 CE)進行了各種修復。發行說明還記錄了修復。

所以我建議抑制回歸你啟用它。

Trace flag 9481解決了您的問題,因為如果強制 SQL Server 使用舊的優化器。所以基本上你使用的是 SQL Server 2014,但不是它附帶的新 CE。

Trace flag 4199確保優化器使用自 SQL Server 2005 以來對 SQL Server 優化器所做的所有更改/修復。

來自這篇支持文章

跟踪標誌 4199 用於收集打算在未來版本中預設啟用的修補程序,而其他跟踪標誌用於修復不打算以目前形式預設啟用的情況。從 SQL Server 2016 RTM 開始,將使用數據庫 COMPATIBILITY_LEVEL 設置預設啟用與跟踪標誌 4199 相關的修補程序。本文介紹瞭如何為 SQL Server 2016 及更高版本提供影響計劃的修補程序的機制和策略。

根據需要,有三種方法可以做到。

  1. 通過在目標查詢之前批量啟用跟踪標誌(通過使用DBCC TRACEON命令),然後在查詢之後立即禁用跟踪標誌(通過使用 DBCC TRACEOFF 命令)。
  2. 從 Microsoft SQL Server 2005 Service Pack 2 (SP2) 和 Microsoft SQL Server 2008 開始,可以使用查詢級選項“QUERYTRACEON”。此選項允許您僅在單查詢編譯期間啟用影響計劃的跟踪標誌。
  3. 您在啟動參數中啟用它。

第一點和第二點將僅確保查詢/批處理以 4199 跟踪標誌執行,而第三點確保執行的任何查詢都看到此跟踪標誌已啟用。

**注意:**啟用跟踪標誌需要係統管理員權限,因此如果您要求開發人員在查詢中使用它,例如,他可能無法假設開發人員的訪問權限有限。

我建議您使用querytraceondbcc traceon查看查詢是否符合要求。

我在宣布新 CE 時看到的一個建議來自 Brent Ozar。在使用 2014 之前,您需要對此進行測試。在 2014 上執行,但水平指示 2012,並對時間和計劃進行基準測試。然後切換到 2014 年的水平,看看哪些計劃發生了變化。從那裡你試圖調整糟糕的計劃。

跟踪標誌 4199 已經存在了很長時間,我們在 2008R2 和 2012 中使用。如果您可以進行基準測試,您將不得不在兩次執行中使用相同的跟踪標誌。

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