dbms_stats包收集統計信息

http://blog.csdn.net/weiwangsisoftstone/article/details/8554055

dbms_stats 包含很多存儲過程,爲收集、刪除、導出、導入統計信息提供了存儲過程常見如下,詳細的請參見官方文檔PL/SQL Packages and Types Reference
dbms_stats包收集統計信息是oracle推薦使用的

DBMS_STATS包中用於收集統計信息常用的過程:
EXPORT_COLUMN_STATS:導出列的分析信息
EXPORT_INDEX_STATS:導出索引分析信息
EXPORT_SYSTEM_STATS:導出系統分析信息
EXPORT_TABLE_STATS:導出表分析信息
EXPORT_SCHEMA_STATS:導出方案分析信息
EXPORT_DATABASE_STATS:導出數據庫分析信息
IMPORT_COLUMN_STATS:導入列分析信息
IMPORT_INDEX_STATS:導入索引分析信息
IMPORT_SYSTEM_STATS:導入系統分析信息
IMPORT_TABLE_STATS:導入表分析信息
IMPORT_SCHEMA_STATS:導入方案分析信息
IMPORT_DATABASE_STATS:導入數據庫分析信息
GATHER_INDEX_STATS:分析索引信息
GATHER_TABLE_STATS:分析表信息,當cascade爲true時,分析表、列(索引)信息
GATHER_SCHEMA_STATS:分析方案信息
GET_COLUMN_STATS:獲取字段的統計信息
GET_SYSTEM_STATS:獲取系統的統計信息
GET_INDEX_STATS:獲取索引的統計信息
GET_TABLE_STATS:獲取表的統計信息
SET_COLUMN_STATS:設置字段的統計信息。通常應用在測試環境,也不排除在極端情況下起到奇效。
SET_SYSTEM_STATS:設置系統的統計信息
SET_INDEX_STATS:設置索引的統計信息
SET_TABLE_STATS:設置表的統計信息
DELETE_COLUMN_STATS:刪除字段的統計信息
DELETE_SYSTEM_STATS:刪除系統的統計信息
DELETE_INDEX_STATS:刪除索引的統計信息
DELETE_TABLE_STATS:刪除表的統計信息
DELETE_DATABASE_STATS:刪除數據庫的統計信息
DELETE_DICTIONARY_STATS:刪除數據字典的統計信息
DELETE_SCHEMA_STATS:刪除用戶方案的統計信息
DELETE_FIXED_OBJECTS_STATS:刪除固定對象的統計信息
GATHER_SCHEMA_STATS:分析方案信息
GATHER_DATABASE_STATS:分析數據庫信息
GATHER_SYSTEM_STATS:分析系統信息
CREATE_STAT_TABLE:建立存放統計信息的表
DROP_STAT_TABLE:刪除存放統計信息的表
LOCK_TABLE_STATS:鎖定表的統計信息。當覺得當前統計信息非常好,且表數據幾乎不變化時,可以考慮鎖定統計信息,鎖定之後相關的所有數據分析,包括表級,列級,直方圖、索引的分析都將被鎖定,不允許被更新。
LOCK_SCHEMA_STATS:鎖定用戶方案的統計信息
UNLOCK_TABLE_STATS:解鎖表的統計信息
UNLOCK_SCHEMA_STATS:解鎖用戶方案的統計信息
RESTORE_SYSTEM_STATS:還原系統的統計信息
RESTORE_INDEX_STATS:還原索引的統計信息
RESTORE_TABLE_STATS:還原表的統計信息
RESTORE_DATABASE_STATS:還原數據庫的統計信息
RESTORE_DICTIONARY_STATS:還原數據字典的統計信息
RESTORE_SCHEMA_STATS:還原用戶方案的統計信息
RESTORE_FIXED_OBJECTS_STATS:還原固定對象的統計信息

DBMS_STATS.GATHER_TABLE_STATS的語法如下:
DBMS_STATS.GATHER_TABLE_STATS (
  ownname          VARCHAR2,
  tabname          VARCHAR2,
  partname         VARCHAR2 DEFAULT NULL,
  estimate_percent NUMBER   DEFAULT to_estimate_percent_type
                                               (get_param('ESTIMATE_PERCENT')),
  block_sample     BOOLEAN  DEFAULT FALSE,
  method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),
  degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),
  granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
  cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),
  stattab          VARCHAR2 DEFAULT NULL,
  statid           VARCHAR2 DEFAULT NULL,
  statown          VARCHAR2 DEFAULT NULL,
  no_invalidate    BOOLEAN  DEFAULT  to_no_invalidate_type (
                                    get_param('NO_INVALIDATE')),
  force            BOOLEAN DEFAULT FALSE);

參數說明:
ownname:要分析表的擁有者
tabname:要分析的表名.
partname:分區的名字,只對分區表或分區索引有用.
estimate_percent:採樣行的百分比,取值範圍[0.000001,100],null爲全部分析,不採樣. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默認值,由oracle決定最佳取採樣值.
block_sapmple:是否用塊採樣代替行採樣.
method_opt:決定histograms信息是怎樣被統計的
通過設置 method_opt參數可以智能地生成直方圖,具體取值如下:
for all columns:10g默認值(根據版本的不同,默認值也會有所差異),統計所有列的histograms.
for all indexed columns:統計所有indexed列的histograms.
for all hidden columns:統計你看不到列的histograms
for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:統計指定列的histograms.N的取值範圍[1,254];
REPEAT上次統計過的histograms;
AUTO由oracle決定N的大小;
SKEWONLY選項會耗費大量處理時間,因爲它要檢查每個索引中的每個列的值的分佈情況。
假如dbms_stat發現一個索引的各個列分佈得不均勻,就會爲那個索引創建直方圖,幫助基於代價的SQL優化器決定是進行索引訪問,還是進行全表掃描訪問。
degree:決定並行度.默認值爲null.
granularity:設置分區表收集統計信息的粒度,分別有
all:對錶全局,分區,子分區的數據都做分析
auto:Oracle根據分區的類型,自動決定做哪一種粒度的分析
global:只做全局級別的分析
global and partition:只對全局和分區級別做分析,對子分區不做分析,這是和all的一個區別
partition:只做分區級別做分析
subpartition:只做子分區做分析
exec DBMS_STATS.GATHER_TABLE_STATS(NULL,'T3', GRANULARITY => 'SUBPARTITION', CASCADE => TRUE);
exec DBMS_STATS.GATHER_TABLE_STATS(NULL,'T2', GRANULARITY => 'PARTITION', CASCADE => TRUE);  
exec DBMS_STATS.GATHER_TABLE_STATS(NULL,'T1', GRANULARITY => 'GLOBAL', CASCADE => TRUE);
其中,T1爲全表,T2爲分區,T3爲子分區
cascace:是收集索引的信息.默認爲falase.
stattab指定要存儲統計信息的表;
statid如果多個表的統計信息存儲在同一個stattab中用於進行區分;
statown存儲統計信息表的擁有者。以上三個參數若不指定,統計信息會直接更新到數據字典.
no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE.
force:即使表鎖住了也收集統計信息.

其他過程參數說明參見oracle官方文檔
例子:
BEGIN
  DBMS_STATS.CREATE_STAT_TABLE ('hr', 'savestats'); ---創建存儲統計信息的統計信息表
  DBMS_STATS.GATHER_TABLE_STATS ('hr', 'employees', stattab => 'savestats');  --收集表的統計信息並導出到統計信息表裏
END;

BEGIN
  DBMS_STATS.DELETE_TABLE_STATS ('hr', 'employees'); ---刪除表的統計信息
  DBMS_STATS.IMPORT_TABLE_STATS ('hr', 'employees', stattab => 'savestats'); --從一張統計信息表把統計信息導入到當前的模式下
END;

收集整個模式的統計信息:
exec dbms_stats.gather_schema_stats(ownname=>'hr');


收集模式中任何“過時”的表的統計信息
exec dbms_stats.gather_schema_stats(ownname=>'hr',options=>'gather stale');




查看統計信息狀態

SELECT /*+ UNNEST */  

     DISTINCT TABLE_NAME, LAST_ANALYZED, STALE_STATS  

 FROM DBA_TAB_STATISTICS  

WHERE LAST_ANALYZED IS NULL OR STALE_STATS = 'YES' AND OWNER = 'SCOTT';


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