對于SQL Server數據庫來說,性能一直是一個繞不開的話題。而當我們去分析和研究性能問題時,執行計劃又是一個我們一直關注的重點之一。
我們知道,在進行編譯時,SQL Server會根據當前的數據庫里的統計信息,在一定的時間內,結合本機資源,挑選一個當前最佳的執行計劃去執行該語句。
那么數據庫分析引擎如何使用這些統計信息的呢?數據庫引擎會根據數據庫里的統計信息,去計算每次操作大約返回多少行。這個動作稱之為基數計算(cardinalityestimation)。數據庫分析引擎會基于這些信息判斷選擇邏輯或物理的操作符,操作成本等等,生成一系列執行計劃并最終挑選一個合適的執行計劃。
在SQL Server 2014中,基數計算與之前的版本相比出現了較大的變化,并且這些變化對執行計劃的生成有客觀的促進作用。新的基數計算相對于之前的版本而言并不是增加了一個新的補丁,修復了一些bug,可以說是一次重寫,甚至基于的數學計算模型也發生了變化。
新的基數計算主要適用于DW(數據倉庫)的場景,會給DW系統帶來較大的性能提升。
就效果而言,由于采用的數學模型的一些變化,新的基數計算在對返回行數預估上,較以往往往會更加準確。
以下兩個例子是對新舊基數計算的對比。
1. 獨立性假設
測試語句如下:
1 Select *2 From Cars3 Where Make=‘Honda’ AND Model =‘Civic’
在測試數據庫中運行上述語句,其中表的行數是1000行,Make=’Honda’ 有200行,Model=’Civic’有50行。
在之前般的CE中,會認為這兩個篩選條件之前沒關系,所以預測返回行數是0.05 * 0.2* 1000 = 10, 而在新的版本CE中,會認為這兩者之間應該是有關系的,因此會采用指數退避算法,預測返回值是0.05* sqrt(0.2) * 1000 = 22.36。
實際返回行數50行。
因此新的CE會更加的保守,在這種情況下會更加準確。
2. 連接(join)的變化
當出現等值連接時,會采用下面的計算方法:
例如
新的基數計算涉及的修改較多,例如還有針對ascending key場景所做的修改,使用統計信息方法的修改等等。但是對傳統的一些內容仍然保持原樣,例如表變量預估為一行,存儲過程中的本地變量會認為是未知值,parametersniffing 問題仍然可能發生等等。
但是總整體而言,新的基數計算給DW場景的工作負載會帶來客觀的性能提升,包括編譯時間和執行時間兩方面。前述中我們提到了統計信息,在SQLServer 2014中,會有一個新的統計信息概念,增量統計信息(Incremental Statistics)。
一般說來,統計信息記錄的是列或者索引中的數據分布,數據密度等等。當用戶打開自動統計信息更新后,假如數據發生了大約20%的變化,那么會觸發統計信息自動更新。
在舊的版本數據庫中,關于統計信息會遇有以下兩個不足之處:1. 對于非常大的表,20%的自動統計信息閾值太大。2.重建統計信息需要重新掃描或者重新取樣掃描整個表,假如能做到只掃描新的數據,那么更佳。
以此為目標,SQL Server 2014 出現了一個新的功能增量統計信息(IncrementalStatistics)。
Incremental Statistics有以下特點:
原文鏈接:http://blogs.msdn.com/b/apgcdsd/archive/2014/12/25/sql-2014-7-new-design-for-cardinality-estimation.aspx
新聞熱點
疑難解答