Oracle統計信息(四)—— 常用統計信息 及 統計信息收集原則與建議

包含以下類別統計信息:

  • 全局統計信息
  • 系統統計信息
  • 數據字典統計信息
  • 內部對象統計信息

 

一、 全局統計信息

1. 定義

全局統計信息是指直接從對象這一級收集到的統計信息,而不是由其下一級對象“推導”或“彙總”得到的信息。例如分區表的全局統計信息是指直接從表這一級收集到的統計信息,而非由其分區統計信息“推導”或“彙總”得到。

從全局統計信息的定義可以看出,它只對分區表及分區索引有意義。

 

2. 全局統計信息收集

dbms_stats.gather_table_stats中的granularity參數專用於指定全局統計信息的收集策略。

可選值如下,這些值指定了哪個級別上的統計信息會被收集:

  • global(表)
  • partition(分區)
  • subpartition(子分區)
  • global and partition(表+分區)
  • all(表+分區+子分區)
  • auto(默認,由oracle根據分區表類型自動選擇)
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',estimate_percent => 100,granularity=>'all',degree=>4);
exec dbms_stats.gather_table_stats(ownname => 'USER01',tabname => 'TAB01',estimate_percent => 100,granularity=>'partition');

分區及統計信息相關數據字典中的global_stats列可用於判斷相關對象是否收集了全局統計信息

 

3. 注意事項

使用dbms_stats收集全局統計信息時,如果將granularity指定爲較低級別,更低級的統計信息會保持不變。如果高一級的統計信息之前global_stats=yes,則保持不變;如果爲no,會由收集的這一級進行推導彙總得出。推導彙總不能跨級別,例如收集子分區統計信息只可能推導至分區級,無法推導至表級。

analyze命令只能在最低級別收集統計信息,高級別統計信息只能由推導彙總得出,推導規則與dbms_stats相同。

應該使用dbms_stats收集和刪除全局統計信息,收集時應該使用一致的granularity參數。

 

二、 系統統計信息

系統統計信息是用於描述oracle數據庫服務器系統處理能力的輔助統計信息。主要包括:cpu主頻、單塊讀平均耗時、多塊讀平均耗時、單塊多次讀所能讀取的數據塊平均值等。藉助系統統計信息,oracle可以更清楚目標服務器的實際處理能力。

收集方法

  • 執行dbms_stats.gather_system_stats('start') 開始收集系統統計信息
  • 實際使用系統,最好能以系統典型負載運行一段時間
  • 執行dbms_stats.gather_system_stats('stop') 結束

由上述收集方法可以看出,系統統計信息實際代表了數據庫服務器在指定負載下的cpu和io處理能力,從此CBO將包括IO和CPU cost,另外對原有全表掃描的IO cost計算方法也發生了變化。

 

三、 數據字典統計信息

數據字典統計信息用於描述數據字典基表(例如TAB$,IND$)、索引、列的信息,其實與普通表沒有太大區別。

dbms_stats.gather_dictionary_stats和dbms_stats.delete_dictionary_stats用於收集和刪除數據庫的數據字典統計信息。

當然也可以用dbms_stats.gather_table_stats等收集單獨的統計信息

exec dbms_stats.gather_table_stats(ownname='SYS',tabname=>'TAB$',cascade=>true);

 

四、 內部對象統計信息

內部對象統計信息用於描述內部表(例如X$系列表)的詳細信息。X$系列表實際上oracle自定義的內存結構,存儲於實例相關的各種信息,它們是數據庫運行的基礎。

如果內部表的統計信息不準,輕則相關操作變慢,重則hang住整個數據庫。

dbms_stats.gather_fixed_objects_stats和dbms_stats.delete_fixed_objects_stats用於收集和刪除數據庫的內部表統計信息。

當然也可以用dbms_stats.gather_table_stats等收集單獨的統計信息

exec dbms_stats.gather_table_stats(ownname='SYS',tabname=>'X$KCCRSR',cascade=>true);

oracle默認不會收集內部對象統計信息,包括默認的自動統計信息收集作業。建議僅在明確診斷出系統出現性能問題是因爲內部對象統計信息不準時才收集。

注意事項

  • gather_fixed_objects_stats執行耗時可能比較長,特別是在系統處於高負載狀態時,收集可能會加劇cpu使用甚至導致系統hang住。所以,應該在系統有一定負載但又不是很忙時進行收集,在完全空閒時收集的內部對象統計信息沒有代表性。
  • 由於X$表實際是內存結構,因此RAC環境下如果要收集,應該對每個節點都執行
  • 如果能準確定位到是哪個內部對象統計信息有誤,建議使用gather_table_stats單獨收集此對象統計信息。

 

五、 統計信息收集原則與建議

量體裁衣,找到適合自己系統的統計信息收集策略,用盡量小的代價收集到能穩定跑出正確執行計劃的統計信息即可。也就是說統計信息不一定要特別準,只要有代表性,足夠跑出正確執行計劃就可以了。

  • 表中導入大量數據後,如果業務馬上會查詢相關表,建議在業務查詢前先收集對應表統計信息。對於新建或遷移的空表,導入少量數據後也應該及時收集相關統計信息
  • 及時對包含日期類型字段的表收集統計信息,避免謂詞越界
  • 對於採樣比例,11g開始建議用dbms_stats.auto_sample_size,10g及以下建議爲30%,當然主要根據實際情況而定
  • 應該使用dbms_stats收集和刪除分區表全局統計信息,收集時應該使用一致的granularity參數。
  • 建議額外收集系統統計信息,除非系統硬件環境發生變化,否則收集一次就夠了
  • 僅在明確診斷出系統出現性能問題是因爲內部對象統計信息不準時才收集內部對象統計信息
  • 只對已存在直方圖的列重複收集直方圖信息,初次直方圖信息收集由瞭解系統的DBA手工操作

 

參考:《基於oracle的sql優化》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章