小心SQL SERVER 2014新特性——基數評估引起一些性能問題

来源:http://www.cnblogs.com/kerrycode/archive/2016/01/10/5118101.html
-Advertisement-
Play Games

在前陣子寫的一篇博文“SQL SERVER 2014 下IF EXITS 居然引起執行計劃變更的案例分享”里介紹了資料庫從SQL SERVER 2005升級到 SQL SERVER 2014後,發現一個SQL出現性能問題,當時分析後發現執行計劃變了,導致SQL出現了性能問題。但是沒有徹底搞清楚為什麼...


    在前陣子寫的一篇博文“SQL SERVER 2014 下IF EXITS 居然引起執行計劃變更的案例分享”里介紹了資料庫從SQL SERVER 2005升級到 SQL SERVER 2014後,發現一個SQL出現性能問題,當時分析後發現執行計劃變了,導致SQL出現了性能問題。但是沒有徹底搞清楚為什麼出現這種情況。當時看到Actual Number of Rows 與Estimated Number of Rows之間的偏差較大(統計信息是最新的),以為是優化器的Bug造成的。其實罪魁禍首是SQL SERVER 2014新特性——基數評估(Cardinality Estimator)所引起的。IF EXISTS完全成了我這個標題黨的替罪羊(罪過罪過)。下麵我再就這個問題展開做一次分析。

 

    查看該SQL語句的實際執行計劃,在屬性裡面我們可以看到CardinalityEstimationModelVersion的值為120,120表示這是新的基數評估,70就是老的基數評估

clipboard

其實當資料庫的相容級別為120的時候,預設使用新的基數評估。也就是說啟用了新的基數評估,那麼我們現在使用查詢跟蹤標記9481來關閉新的基數評估,使用老的基數評估。

DBCC TRACEON(9481, 1);
 
GO

啟用跟蹤標記9481後,這個SQL語句的執行計劃變了(可以對比圖4),可以看到CardinalityEstimationModelVersion的值也變為了70。SQL語句一秒就執行完了。這個是因為基數評估出現了偏差導致了不合適的JOIN演算法。

clipboard[1]

clipboard[2]

我們對比下麵”圖四:舊執行計劃“,發現其實還是使用Nested Loops,只是外部迴圈表與內部迴圈表變了。   

圖四:舊執行計劃

clipboard[3]

那麼關於新的基數評估(Cardinality Estimator)特性,你想多瞭解一些這方面的知識,可以參考官方文檔Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator。 中文翻譯版本可以參考SQL Server 2014新特性——基數評估(白皮書閱讀筆記)下麵是官方文檔關於基數評估出現偏差可能會造成的一些後果:

 

對於基數評估,每個執行計劃中的運算符都有評估值輸入,這個值決定了優化器使用什麼演算法的操作符,同時也決定了最終的執行計劃。所以如果評估出現偏差,會導致執行計劃選擇出現偏差,導致無法選出一個高效的執行計劃。

評估出現偏差會出現以下結果:

如果評估過小:

1.原本可以使用並行計劃更加有效的,現在使用串列計劃

2.不合適的join演算法

3.不合適的索引選擇,和索引訪問方法

如果評估過大:

1.原本使用串列計劃更加有效,現在使用並行計劃

2.不合適的join演算法

3.不合適的索引選擇,和索引訪問方法

4.過多的記憶體分配

5.記憶體浪費和沒必要的併發

上面這段對應的英文資料如下所示(英語原文作參考,這才是原汁原味的信息):

The individual operator cost models receive the estimates as input. The estimates are a major factor in deciding which physical operator algorithms and plan shapes (such as join orders) are chosen. They also determine the final query plan that executes. Given these critical plan choices, when the cardinality estimation process contains a significantly skewed assumption, this can lead to an inefficient plan choice. This can, in turn, result in degraded performance.

Under estimating rows can lead to memory spills to disk, for example, where not enough memory was requested for sort or hash operations. Under estimating rows can also result in:

  1. The selection of serial plan when parallelism would have been more optimal.
  2. Inappropriate join strategies.
  3. Inefficient index selection and navigation strategies.

Inversely, over estimating rows can lead to:

  1. Selection of a parallel plan when a serial plan might be more optimal.
  2. Inappropriate join strategy selection.
  3. Inefficient index navigation strategies (scan versus seek).
  4. Inflated memory grants.
  5. Wasted memory and unnecessarily throttled concurrency.

Improving the accuracy of row estimates can improve the quality of the query execution plan and, as a result, improve the performance of the query.

 

 

 

  其實關於SQL SERVER 2014這個新的基數評估(Cardinality Estimator)特性,確實造成了不少SQL出現性能問題。我們資料庫升級到SQL SERVER 2014後,被這個新特性坑慘了,由於沒有選擇最優的執行計劃,導致一些SQL出現嚴重的性能問題,也間接導致了SQL之間的阻塞(block)急劇上升。開發人員和我都在救火隊員的角色中疲於奔命。最後我不得不採取將資料庫的相容基本從120降為110。從而立馬解決了這個問題。另外從我搜索的一些資料看,SQL SERVER 2014這個新的基數評估(Cardinality Estimator)這個新特性確實還有很多不完善的地方。因為也有不少人都發現升級到SQL Server 2014後出現了性能問題。例如:

   MS SQL Server CPU load goes up dramatically when turning on 2014 features by setting compatibility level

      Query is slow in SQL Server 2014, fast in SQL Server 2012

 

參考資料:

http://dba.stackexchange.com/questions/95609/sql-server-performance-is-slow-when-migrated-from-sql-server-2012-to-sql-server

http://www.cnblogs.com/Amaranthus/p/3678647.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spark中最核心的概念為 RDD(Resilient Distributed DataSets) 中文為: 彈性分散式數據集 ,RDD為對分散式記憶體對象的 抽象它表示一個 被分區不可變 且能 並行操作 的數據集;RDD為可序列化的、可緩存到記憶體對RDD進行操作過後還可以存到記憶體中,下次操作直接把內...
  • Linux安裝redis。
  • 1、登陸到伺服器2、新建一個文件夾來保存webmin,建議在個人用戶下新建。,3、下載Webmin的安裝文件,命令是:wget http://prdownloads.sourceforge.net/webadmin/webmin-1.670.tar.gz到官網下載也可,我喜歡用wget命令來下載。4...
  • SQL Server中所有全局變數都使用兩個@符號作為首碼--1.@@error 最後一個T-SQL錯誤的錯誤號(目的是或得違反約束的錯誤號)insert into Subject values('測試工程師')--違反了約束select @@ERROR --2.@@identity 最後一次插入的...
  • SQL Server 2008中的全局變數及其用法T-SQL程式中的變數分為全局變數和局部變數兩類,全局變數是由SQL Server系統定義和使用的變數。DBA和用戶可以使用全局變數的值,但不能自己定義全局變數。下麵詳細總結一下SQL Server 2008中的33個全局變數,並且寫一下示例.@@....
  • 在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵! 《桃花庵--程式員版》寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;別人笑我太瘋癲,我笑自己命...
  • 有時候忘掉了mysql的root密碼,這種情況下,如何重置root的密碼呢?找到並編輯mysql的my.ini配置文件,在mysqld節點中添加上skip-grant-table. 如下:[mysqld]# These let you safely reset the lost root passw...
  • 集合運算符是針對兩個集合操作的,兩個集合必須有相同的列數;列具有相同的數據類型(至少能夠隱式轉換的);最終輸出的集合的列名是,由第一個集合的列名來確定的(可以用來連接多個結果)。註意:聯合【Union】與連接不一樣【Join】。 聯合:將多個結果集,合併為一個結果集。Union(去除重覆,相當...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...