dbms_stats包問世以后,Oracle專家可通過一種簡單的方式來為CBO收集統(tǒng)計數據。目前,已經不再推薦你使用老式的分析表和dbms_utility方法來生成CBO統(tǒng)計數據。那些古老的方式甚至有可能危及SQL的性能,因為它們并非總是能夠捕捉到有關表和索引的高質量信息。CBO使用對象統(tǒng)計,為所有SQL語句選擇最佳的執(zhí)行計劃。
execdbms_stats.gather_schema_stats( - options參數使用4個預設的方法之一,這個選項能控制Oracle統(tǒng)計的刷新方式:
注意,無論gather stale還是gather auto,都要求進行監(jiān)視。如果你執(zhí)行一個alter table xxx monitoring命令,Oracle會用dba_tab_modifications視圖來跟蹤發(fā)生變動的表。這樣一來,你就確切地知道,自從上一次分析統(tǒng)計數據以來,發(fā)生了多少次插入、更新和刪除操作。
estimate_percent選項以下estimate_percent參數是一種比較新的設計,它允許Oracle的dbms_stats在收集統(tǒng)計數據時,自動估計要采樣的一個segment的最佳百分比: method_opt選項dbms_stats的method_opt參數尤其適合在表和索引數據發(fā)生變化時刷新統(tǒng)計數據。method_opt參數也適合用于判斷哪些列需要直方圖(histograms)。 某些情況下,索引內的各個值的分布會影響CBO是使用一個索引還是執(zhí)行一次全表掃描的決策。例如,假如在where子句中指定的值的數量不對稱,全表掃描就顯得比索引訪問更經濟。 如果你有一個高度傾斜的索引(某些值的行數不對稱),就可創(chuàng)建Oracle直方圖統(tǒng)計。但在現(xiàn)實世界中,出現(xiàn)這種情況的機率相當小。使用CBO時,最常見的錯誤之一就是在CBO統(tǒng)計中不必要地引入直方圖。根據經驗,只有在列值要求必須修改執(zhí)行計劃時,才應使用直方圖。 假如dbms_stat發(fā)現(xiàn)一個索引的各個列分布得不均勻,就會為那個索引創(chuàng)建直方圖,幫助基于代價的SQL優(yōu)化器決定是進行索引訪問,還是進行全表掃描訪問。例如,在一個索引中,假定有一個列在50%的行中,如清單B所示,那么為了檢索這些行,全表掃描的速度會快于索引掃描。--*************************************************************
使用alter table xxx monitoring;命令來實現(xiàn)Oracle表監(jiān)視時,需要使用dbms_stats中的auto選項。如清單D所示,auto選項根據數據分布以及應用程序訪問列的方式(例如通過監(jiān)視而確定的一個列的工作量)來創(chuàng)建直方圖。使用method_opt=>’auto’類似于在dbms_stats的option參數中使用gather
auto。begin 并行收集Oracle允許以并行方式來收集CBO統(tǒng)計數據,這就顯著提高了收集統(tǒng)計數據的速度。但是,要想并行收集統(tǒng)計數據,你需要一臺安裝了多個CPU的SMP服務器。 更快的執(zhí)行速度dbms_stats是提高SQL執(zhí)行速度的一種出色機制。通過使用dbms_stats來收集最高質量的統(tǒng)計數據,CBO能夠正確判斷執(zhí)行任何SQL查詢時的最快途徑。dbms_stats還在不斷地改進。目前,它的一些令人激動的新特性(自動樣本大小和自動直方圖生成)已經顯著簡化了Oracle專家的工作。
如何使用dbms_stats分析統(tǒng)計信息?Dbms_stats是oracle8i新增的程序包,它使統(tǒng)計數據的生成和處理更加方便,很多人都在推薦使用dbms_stats替代analyze,我倒是不怎么用過,記錄一下 estimate_percent --估算抽樣百分比 --創(chuàng)建統(tǒng)計信息歷史保留表 pl/sql procedure successfully completed --導出整個scheme的統(tǒng)計信息 pl/sql procedure successfully completed --分析scheme --分析表 pl/sql procedure successfully completed --分析索引 pl/sql procedure successfully completed --如果發(fā)現(xiàn)執(zhí)行計劃走錯,刪除表的統(tǒng)計信息 pl/sql procedure successfully completed --導入表的歷史統(tǒng)計信息 pl/sql procedure successfully completed --如果進行分析后,大部分表的執(zhí)行計劃都走錯,需要導回整個scheme的統(tǒng)計信息 pl/sql procedure successfully completed --導入索引的統(tǒng)計信息 --檢查是否導入成功 TABLE_NAME NUM_ROWS BLOCKS LAST_ANALYZED ------------------------------ ---------- ---------- ------------- WORK_LIST 4005 186 2007-10-12 15 SQL> analyze和dbms_stats不同的地方: |
|
來自: 昵稱10087950 > 《Oracle》