大家好,歡迎回到性能調優培訓。上個星期我們討論在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.databases2 3 GO
如果在你面前有一個執行計劃,你可以對SELECT運算符查看下它的屬性窗口,看下CardinalityEstimationModelVersion屬性值。70表示使用老的基數計算,120表示使用新的基數計算。
另外,SQL Server 2014提供下列2個新的跟蹤標記:
使用2312跟蹤標記你可以指出,你想使用SQL Server 2014新的基數計算(例如,當你想使用低于120的兼容級別)。如果你想回到老的基數計算,就可以使用9481跟蹤標記。你可以在實例級別,會話級別,也可以通過QUERYTRACEON查詢提示來設置這些跟蹤標記。我們來看下面的例子,使用2312跟蹤標記來強制使用新的基數計算。
1 SELECT * FROM Person.Person2 OPTION (QUERYTRACEON 2312)3 GO
新基數計算提供很多改變,可以帶來更好的估計,更有可能帶來更好的執行計劃。微軟已經對基數計算的下列領域進行了重寫:
如果你想了解這些改變的更多細節,我強烈推薦讀下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)。請繼續關注!
新聞熱點
疑難解答