dbms_stats包問世以後Oracle專家可通過一種簡單的方式來為CBO收集統計數據目前已經不再推薦你使用老式的分析表和dbms_utility方法來生成CBO統計數據那些古老的方式甚至有可能危及SQL的性能因為它們並非總是能夠捕捉到有關表和索引的高質量信息CBO使用對象統計為所有SQL語句選擇最佳的執行計劃
dbms_stats能良好地估計統計數據(尤其是針對較大的分區表)並能獲得更好的統計結果最終制定出速度更快的SQL執行計劃
清單A展示了dbms_stats的一次示范執行情況其中使用了options子句
execdbms_statsgather_schema_stats(
ownname => SCOTT
options => GATHER AUTO
estimate_percent => dbms_statsauto_sample_size
method_opt => for all columns size repeat
degree =>
)
為了充分認識dbms_stats的好處你需要仔細體會每一條主要的預編譯指令(directive)下面讓我們研究每一條指令並體會如何用它為基於代價的SQL優化器收集最高質量的統計數據
options參數
使用個預設的方法之一這個選項能控制Oracle統計的刷新方式
gather——重新分析整個架構(Schema)
gather empty——只分析目前還沒有統計的表
gather stale——只重新分析修改量超過%的表(這些修改包括插入更新和刪除)
gather auto——重新分析當前沒有統計的對象以及統計數據過期(變髒)的對象注意使用gather auto類似於組合使用gather stale和gather empty
注意無論gather stale還是gather auto都要求進行監視如果你執行一個alter table xxx monitoring命令Oracle會用dba_tab_modifications視圖來跟蹤發生變動的表這樣一來你就確切地知道自從上一次分析統計數據以來發生了多少次插入更新和刪除操作
estimate_percent選項
以下estimate_percent參數是一種比較新的設計它允許Oracle的dbms_stats在收集統計數據時自動估計要采樣的一個segment的最佳百分比
estimate_percent => dbms_statsauto_sample_size
要驗證自動統計采樣的准確性你可檢視dba_tables sample_size列一個有趣的地方是在使用自動采樣時Oracle會為一個樣本尺寸選擇到的百分比記住統計數據質量越好CBO做出的決定越好
method_opt選項
dbms_stats的method_opt參數尤其適合在表和索引數據發生變化時刷新統計數據method_opt參數也適合用於判斷哪些列需要直方圖(histograms)
某些情況下索引內的各個值的分布會影響CBO是使用一個索引還是執行一次全表掃描的決策例如假如在where子句中指定的值的數量不對稱全表掃描就顯得比索引訪問更經濟
如果你有一個高度傾斜的索引(某些值的行數不對稱)就可創建Oracle直方圖統計但在現實世界中出現這種情況的機率相當小使用CBO時最常見的錯誤之一就是在CBO統計中不必要地引入直方圖根據經驗只有在列值要求必須修改執行計劃時才應使用直方圖
為了智能地生成直方圖Oracle為dbms_stats准備了method_opt參數在method_opt子句中還有一些重要的新選項包括skewonlyrepeat和automethod_opt=>for all columns size skewonly
method_opt=>for all columns size repeat
method_opt=>for all columns size auto
skewonly選項會耗費大量處理時間因為它要檢查每個索引中的每個列的值的分布情況
假如dbms_stat發現一個索引的各個列分布得不均勻就會為那個索引創建直方圖幫助基於代價的SQL優化器決定是進行索引訪問還是進行全表掃描訪問例如在一個索引中假定有一個列在%的行中如清單B所示那麼為了檢索這些行全表掃描的速度會快於索引掃描*************************************************************
SKEWONLY option—Detailed analysis
Use this method for a firsttime analysis for skewed indexes
This runs a long time because all indexes are examined
*************************************************************
begin
dbms_statsgather_schema_stats(
ownname => SCOTT
estimate_percent => dbms_statsauto_sample_size
method_opt => for all columns size skewonly
degree =>
);
end;
重新分析統計數據時使用repeat選項重新分析任務所消耗的資源就會少一些使用repeat選項(清單C)時只會為現有的直方圖重新分析索引不再搜索其他直方圖機會定期重新分析統計數據時你應該采取這種方式**************************************************************
REPEAT OPTION Only reanalyze histograms for indexes
that have histograms
Following the initial analysis the weekly analysis
job will use the repeat option The repeat option
tells dbms_stats that no indexes have changed and
it will only reanalyze histograms for
indexes that have histograms
**************************************************************begin
dbms_statsgather_schema_stats(
ownname => SCOTT
estimate_percent => dbms_statsauto_sample_size
method_opt => for all columns size repeat
degree =>
);
end;
使用alter table xxx monitoring;命令來實現Oracle表監視時需要使用dbms_stats中的auto選項如清單D所示auto選項根據數據分布以及應用程序訪問列的方式(例如通過監視而確定的一個列的工作量)來創建直方圖使用method_opt=>auto類似於在dbms_stats的option參數中使用gather autobegin
dbms_statsgather_schema_stats(
ownname => SCOTT
estimate_percent => dbms_statsauto_sample_size
method_opt => for all columns size auto
degree =>
);
end;
並行收集
Oracle允許以並行方式來收集CBO統計數據這就顯著提高了收集統計數據的速度但是要想並行收集統計數據你需要一台安裝了多個CPU的SMP服務器
更快的執行速度
dbms_stats是提高SQL執行速度的一種出色機制通過使用dbms_stats來收集最高質量的統計數據CBO能夠正確判斷執行任何SQL查詢時的最快途徑dbms_stats還在不斷地改進目前它的一些令人激動的新特性(自動樣本大小和自動直方圖生成)已經顯著簡化了Oracle專家的工作
一般在周末的時候使用dbms_stats和estimate
2%的DB Cache
指表的塊數(hwm之下的blocks)為db_cache_size的%
這個包的下面四個存儲過程分別收集indextableschemadatabase的統計信息
gather_index_stats
gather_table_stats
gather_schema_stats
gather_database_stats
From:http://tw.wingwit.com/Article/program/Oracle/201311/16499.html