天天看點

第16/24周 SQL Server 2014中的基數計算

大家好,歡迎回到性能調優教育訓練。上個星期我們讨論在SQL Server裡基數計算過程裡的一些問題。今天我們繼續詳細談下,SQL Server 2014裡引入的新基數計算。

新基數計算

SQL Server 2014裡一個增強是新的基數計算。上個星期你已經學到老基數計算有些限制,會生成錯誤的估計,這會導緻不好的執行計劃表現。截至SQL Server 2012,你一直在使用自SQL Server 7.0引入的基數計算。

當然,幾年來也有很多問題被修正,但預設它們都沒啟用的——你需要啟用SQL Server裡指定的跟蹤标志才可以使這些修正生效。用那個方法微軟確定它們不會引入所謂的計劃品質退化(Plan-Quality Regressions)。是以新的基數計算在SQL Server裡是自SQL Server 7.0以來在那個領域的第一個重大改變。

新基數計算的目的是提高你執行計劃的品質。但是當然,還是有情況你會看到計劃的退化。是以對于你的工作負荷和指定查詢,你要仔細評估下新基數計算是否可用。是以SQL Server 2014再次引入不同的跟蹤标志,使用它們你可以影響查詢優化器如何工作。

為了使用新基數計算,你的資料庫必須設定資料庫相容級别(Database Compatibility Level)為120。當你從先前SQL Server版本還原或附加資料庫,你的相容級别會改變——是以查詢優化器就不會用到新的基數計算。使用下面的查詢你可以很容易得出在你SQL Server執行個體裡,每個資料庫的相容級别: 

1 SELECT name, compatibility_level FROM sys.databases
2 
3 GO      

如果在你面前有一個執行計劃,你可以對SELECT運算符檢視下它的屬性視窗,看下CardinalityEstimationModelVersion屬性值。70表示使用老的基數計算,120表示使用新的基數計算。

第16/24周 SQL Server 2014中的基數計算

另外,SQL Server 2014提供下列2個新的跟蹤标記:

  • 2312
  • 9481

使用2312跟蹤标記你可以指出,你想使用SQL Server 2014新的基數計算(例如,當你想使用低于120的相容級别)。如果你想回到老的基數計算,就可以使用9481跟蹤标記。你可以在執行個體級别,會話級别,也可以通過QUERYTRACEON查詢提示來設定這些跟蹤标記。我們來看下面的例子,使用2312跟蹤标記來強制使用新的基數計算。

1 SELECT * FROM Person.Person
2 OPTION (QUERYTRACEON 2312)
3 GO      

新基數計算提供很多改變,可以帶來更好的估計,更有可能帶來更好的執行計劃。微軟已經對基數計算的下列領域進行了重寫:

  • 對于多列謂語的估計
  • 如何處理自增鍵列問題
  • 對JOIN謂語的估計
  • 通過擴充事件的故障排除

如果你想了解這些改變的更多細節,我強烈推薦讀下Joe Sack寫的白皮書用SQL Server 2014基數計算優化你的查詢計劃(Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator)。 也可以閱讀下SQL Server 2014裡的針對基數估計的新設計(New Design for Cardinality Estimation)。

小結

在這1期的性能調優教育訓練我給你概括介紹了SQL Server 2014引入的新基數計算。

這個月我們已經對SQL Server裡的統計資訊進行了非常深入的學習!在過去的4個星期裡,我們看到它們對獲得好性能的執行計劃确實非常重要。從下個星期開始,第5個月的性能調優教育訓練開始了,你會學習到SQL Server裡的鎖,阻塞和死鎖(Locking, Blocking, and Deadlocking)。請繼續關注!

圍觀PPT:

 0907_16_SQL_Server_2014中的基數計算.rar

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀