淺談SQL Server中統計對於查詢的影響

簡介

    SQL Server查詢分析器是基於開銷的。一般來說,查詢分析器會根據謂詞來肯定該如何選擇高效的查詢路線,好比該選擇哪一個索引。而每次查詢分析器尋找路徑時,並不會每一次都去統計索引中包含的行數,值的範圍等,而是根據必定條件建立和更新這些信息後保存到數據庫中,這也就是所謂的統計信息。數據庫

 

如何查看統計信息

    查看SQL Server的統計信息很是簡單,使用以下指令:性能

    DBCC SHOW_STATISTICS('表名','索引名')測試

 

    所獲得的結果如圖1所示。優化

    

    圖1.統計信息spa

 

統計信息如何影響查詢

    下面咱們經過一個簡單的例子來看統計信息是如何影響查詢分析器。我創建一個測試表,有兩個INT值的列,其中id爲自增,ref上創建非彙集索引,插入100條數據,從1到100,再插入9900條等於100的數據。圖1中的統計信息就是示例數據的統計信息。blog

    此時,我where後使用ref值做爲查詢條件,可是給定不一樣的值,咱們能夠看出根據統計信息,查詢分析器作出了不一樣的選擇,如圖2所示。索引

    

     圖2.根據不一樣的謂詞,查詢優化器作了不一樣的選擇get

 

     其實,對於查詢分析器來講,柱狀圖對於直接能夠肯定的謂詞很是管用,這些謂詞好比:qt

    where date = getdate() 效率

    where id= 12345 

    where monthly_sales < 10000 / 12 

    where name like 「Careyson」 + 「%」

 

    可是對於好比

    where price = @vari 

    where total_sales > (select sum(qty) from sales) 

    where a.id =b.ref_id

    where col1 =1 and col2=2

 

    這類在運行時才能知道值的查詢,採樣步長就明顯不是那麼好用了。另外,上面第四行若是謂詞是兩個查詢條件,使用採樣步長也並很差用。由於不管索引有多少列,採樣步長僅僅存儲索引的第一列。當柱狀圖再也不好用時,SQL Server使用密度來肯定最佳的查詢路線。

    密度的公式是:1/表中惟一值的 個數。當密度越小時,索引越容易被選中。好比圖1中的第二個表,咱們能夠經過以下公式來計算一下密度:

    

    圖3.某一列的密度

 

    根據公式能夠推斷,當表中的數據量逐漸增大時,密度會愈來愈小。

    對於那些不能根據採樣步長作出選擇的查詢,查詢分析器使用密度來估計行數,這個公式爲:估計的行數=表中的行數*密度

    那麼,根據這個公式,若是我作查詢時,估計的行數就會爲如圖4所示的數字。

    

    圖4.估計的行數

 

    咱們來驗證一下這個結論,如圖5所示。

    

    圖5.估計的行數

 

    所以,能夠看出,估計的行數是和實際的行數有出入的,當數據分佈均勻時,或者數據量大時,這個偏差將會變的很是小。

 

統計信息的更新

    由上面的例子能夠看到,查詢分析器因爲依賴於統計信息進行查詢,那麼過期的統計信息則可能致使低效率的查詢。統計信息既能夠由SQL Server來進行管理,也能夠手動進行更新,也能夠由SQL Server管理更新時手動更新。

    當開啓了自動更新後,SQL Server監控表中的數據更改,當達到臨界值時則會自動更新數據。這個標準是:

  •     向空表插入數據時
  •     少於500行的表增長500行或者更多
  •     當表中行多於500行時,數據的變化量大於20%時

    上述條件的知足均會致使統計被更新。

    固然,咱們也可使用以下語句手動更新統計信息。

     

     UPDATE STATISTICS 表名[索引名]

 

列級統計信息

    SQL Server還能夠針對不屬於任何索引的列建立統計信息來幫助查詢分析器獲取」估計的行數「.當咱們開啓數據庫級別的選項「自動建立統計信息」如圖6所示。

    

    圖6.自動建立統計信息

 

   當這個選項設置爲True時,當咱們where謂詞指定了不在任何索引上的列時,列的統計信息會被建立,可是會有如下兩種狀況例外:

  •     建立統計信息的成本超過生成查詢計劃的成本
  •     當SQL Server忙時不會自動生成統計信息

 

   咱們能夠經過系統視圖sys.stats來查看這些統計信息,如圖7所示。

    

    圖7.經過系統視圖查看統計信息

 

    固然,也能夠經過以下語句手動建立統計信息:

    CREATE STATISTICS 統計名稱 ON 表名 (列名 [,...n])

 

總結

    本文簡單談了統計信息對於查詢路徑選擇的影響。過期的統計信息很容易形成查詢性能的下降。所以,按期更新統計信息是DBA重要的工做之一。

相關文章
相關標籤/搜索