导航

    <#CACHE_INCLUDE_NAVBAR#>
« 如何生成Oracle AWR報告VMware推出全新虛擬化認證項目——VCAP »

使用dbms_stats包收集統計數據

2011年1月18日 Linux 0条评论 0个引用

dbms_stats包問世以後,Oracle專家可通過壹種簡單的方式來為CBO收集統計數據。目前,已經不再推薦妳使用老式的分析表和dbms_utility方法來生成CBO統計數據。那些古老的方式甚至有可能危及SQL的性能,因為它們並非總是能夠捕捉到有關表和索引的高質量信息。CBO使用對象統計,為所有SQL語句選擇最佳的執行計劃。

  dbms_stats能良好地估計統計數據(尤其是針對較大的分區表),並能獲得更好的統計結果,最終制定出速度更快的SQL執行計劃。

  清單A展示了dbms_stats的壹次示範執行情況,其中使用了options子句。

  execdbms_stats.gather_schema_stats( -

  ownname => 'SCOTT', -

  options => 'GATHER AUTO', -

  estimate_percent => dbms_stats.auto_sample_size, -

  method_opt => 'for all columns size repeat', -

  degree => 15 -

  )

  為了充分認識dbms_stats的好處,妳需要仔細體會每壹條主要的預編譯指令(directive)。下面讓我們研究每壹條指令,並體會如何用它為基於代價的SQL優化器收集最高質量的統計數據。

  options參數

  使用4個預設的方法之壹,這個選項能控制Oracle統計的刷新方式:

  gather——重新分析整個架構(Schema)。

  gather empty——只分析目前還沒有統計的表。

  gather stale——只重新分析修改量超過10%的表(這些修改包括插入、更新和刪除)。

  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_stats.auto_sample_size

  要驗證自動統計采樣的準確性,妳可檢視dba_tables sample_size列。壹個有趣的地方是,在使用自動采樣時,Oracle會為壹個樣本尺寸選擇5到20的百分比。記住,統計數據質量越好,CBO做出的決定越好。

  method_opt選項

  dbms_stats的method_opt參數尤其適合在表和索引數據發生變化時刷新統計數據。method_opt參數也適合用於判斷哪些列需要直方圖(histograms)。

  某些情況下,索引內的各個值的分布會影響CBO是使用壹個索引還是執行壹次全表掃描的決策。例如,假如在where子句中指定的值的數量不對稱,全表掃描就顯得比索引訪問更經濟。

  如果妳有壹個高度傾斜的索引(某些值的行數不對稱),就可創建Oracle直方圖統計。但在現實世界中,出現這種情況的機率相當小。使用CBO時,最常見的錯誤之壹就是在CBO統計中不必要地引入直方圖。根據經驗,只有在列值要求必須修改執行計劃時,才應使用直方圖。

  為了智能地生成直方圖,Oracle為dbms_stats準備了method_opt參數。在method_opt子句中,還有壹些重要的新選項,包括skewonly,repeat和auto:method_opt=>'for all columns size skewonly'

  method_opt=>'for all columns size repeat'

  method_opt=>'for all columns size auto'

  skewonly選項會耗費大量處理時間,因為它要檢查每個索引中的每個列的值的分布情況。

  假如dbms_stat發現壹個索引的各個列分布得不均勻,就會為那個索引創建直方圖,幫助基於代價的SQL優化器決定是進行索引訪問,還是進行全表掃描訪問。例如,在壹個索引中,假定有壹個列在50%的行中,如清單B所示,那麽為了檢索這些行,全表掃描的速度會快於索引掃描。--*************************************************************

  -- SKEWONLY option—Detailed analysis

  --

  -- Use this method for a first-time analysis for skewed indexes

  -- This runs a long time because all indexes are examined

  --*************************************************************

  begin

  dbms_stats.gather_schema_stats(

  ownname => 'SCOTT',

  estimate_percent => dbms_stats.auto_sample_size,

  method_opt => 'for all columns size skewonly',

  degree => 7

  );

  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_stats.gather_schema_stats(

  ownname => 'SCOTT',

  estimate_percent => dbms_stats.auto_sample_size,

  method_opt => 'for all columns size repeat',

  degree => 7

  );

  end;

  使用alter table xxx monitoring;命令來實現Oracle表監視時,需要使用dbms_stats中的auto選項。如清單D所示,auto選項根據數據分布以及應用程序訪問列的方式(例如通過監視而確定的壹個列的工作量)來創建直方圖。使用method_opt=>’auto’類似於在dbms_stats的option參數中使用gather auto。begin

  dbms_stats.gather_schema_stats(

  ownname => 'SCOTT',

  estimate_percent => dbms_stats.auto_sample_size,

  method_opt => 'for all columns size auto',

  degree => 7

  );

  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的2%.

  --------------------

  這個包的下面四個存儲過程分別收集index、table、schema、database的統計信息,

  gather_index_stats

  gather_table_stats

  gather_schema_stats

  gather_database_stats

  -------------------

 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Arwen Build 81206