天天看點

sql server 索引闡述系列八 統計資訊

原文: sql server 索引闡述系列八 統計資訊

一.概述  

  sql server在快速查詢值時隻有索引還不夠,還需要知道操作要處理的資料量有多少,進而估算出複雜度,選擇一個代價小的執行計劃,這樣sql server就知道了資料的分布情況。索引的統計值資訊,還内置政策用來在沒有索引的屬性列上建立統計值。在有索引和沒有索引的屬性列上統計值資訊會被自動維護。大部分場景下不需要手動去維護統計資訊。   

  作用是 sqlserver 查詢優化器使用統計資訊來建立可提高查詢性能的查詢計劃。 對于大多數查詢,查詢優化器已為高品質查詢計劃生成必要的統計資訊。每個索引都會自動建立統計資訊, 統計資訊的準确性直接影響指令的速度,執行計劃的選擇是依據統計資訊。

  1.1 屬性列統計值

  預設情況下,每當在一個查詢的where子句中使用非索引屬性列時,sqlserver會自動地建立統計值,統計名稱以_WA_Sys開頭。

-- 檢視表中非索引的統計資訊
 sp_helpstats PUB_Search_Log      

   如下所示:

 

sql server 索引闡述系列八 統計資訊
sql server 索引闡述系列八 統計資訊

  1.2 自動更新統計資訊的閥值

  在自動更新統計資訊選項 AUTO_UPDATE_STATISTICS 為 ON 時,查詢優化器将确定統計資訊何時可能過期。查詢優化器通過計算自最後統計資訊更新後資料修改的次數并且将這一修改次數與某一門檻值進行比較,确定統計資訊何時可能過期。

  (1)如果在評估時間統計資訊時表基數為 500 或更低,則每達到 500 次修改時更新一次。

  (2)如果在評估時間統計資訊時表基數大于 500,則改變每達到 500 + 20%的行數更新一次(大表特别要注意更新時間)。

二. 統計資訊分析

--查詢統計資訊
DBCC SHOW_STATISTICS(tablename,'indexname')      

  下面是一個複雜的統計資訊,上一次更新統計資訊時間是2018年5月8日,距離現在有二個多月沒更新了,也就是說更新條件沒有達到(改變達到500次 + 20%的行數變動)。

  

sql server 索引闡述系列八 統計資訊
sql server 索引闡述系列八 統計資訊

  2.1 統計資訊三部分:頭資訊,字段選擇性,直方圖。

   (1) 頭資訊

    name:統計資訊名稱,也是索引的名字。

    updated:上一次統計資訊更新時間(重要)。

    rows:上一次統計表中的行數,反映了表裡的資料量。

    rows Sampled: 用于統計資訊計算的抽樣總行數。當表格資料比較大,為了降低消耗,隻會取一小部分資料做抽樣。  rows sampled<rows時候統計資訊可能不是最精确的。

    steps:把資料分成幾組。最多200個組,每個直方圖梯級都包含一個列值範圍,後跟上限列值。

    density:索引第一列字首的選擇性。查詢優化器不使用此 Density, 值此值的目的是為了與 SQL Server 2008 之前的版本實作向後相容。

    average key length:索引列平均位元組數。

    string index: YES 代表字元串索引。

  (2)資料字段選擇性

    all density: 反映了索引列的選擇度。它反映了資料集裡重複的資料量多少,如果資料很少有重複,那麼它選擇性就比較高。 密度為 1/非重複值。值越小選擇性就越高。如果值小于了0.1,那索引的選擇性就非常高了(這一點通過檢視自增ID主鍵索引列,非常明顯小于了0.1的值)。

    average length: 索引列平均位元組長度 例如model 列值平均長度是25個位元組。

    columns:索引列名稱

  (3)直方圖(對應steps 組)

      直方圖度量資料集中每個非重複值的出現頻率。 查詢優化器根據統計資訊對象第一個鍵列中的列值來計算直方圖,它選擇列值的方法是以統計方式對行進行抽樣或對表或視圖中的所有行執行完全掃描。

    range_hi_key: 列值也稱為鍵值。直方圖裡每一組(step)資料最大值 。上圖值是model字元串類型

    range_rows:每組資料區間估算數目。

    eq_rows:表中值與直方圖每組資料庫上限相等的數目

    distinct_range_rows:每組中非重複數目, 如果沒有重複則range_rows等于distinct_range_rows值。

    avg_range_rows:每組資料區間重複值平均數目, (range_rows)

 三. 人工維護的幾種情況

1.查詢執行時間很長

  如果查詢響應時間很長或不可預知,則在執行其他故障排除步驟前,確定查詢具有最新的統計資訊。

2.在升序或降序鍵列上發生插入操作。

  與查詢優化器執行的統計資訊更新相比,升序或降序鍵列(例如 IDENTITY 或實時時間戳列)上的統計資訊可能要求更頻繁地更新。插入操作将新值追加到升序或降序鍵列上

3.在維護操作後。

  考慮在執行維護過程(例如截斷表或對很大百分比的行執行大容量插入)後更新統計資訊。 這可以避免在将來查詢等待自動統計資訊更新時在查詢進行中出現延遲。

-- 更新統計資訊
UPDATE STATISTICS tablename(indexname)      

  更新統計資訊可確定查詢使用最新的統計資訊進行編譯。 不過,更新統計資訊會導緻查詢重新編譯。 我們建議不要太頻繁地更新統計資訊,因為需要在改進查詢計劃和重新編譯查詢所用時間之間權衡性能。