http://blog.csdn.net/weiwangsisoftstone/article/details/8554055web
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:還原固定對象的統計信息oracle
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);ide
參數說明:
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;spa
收集整個模式的統計信息:
exec dbms_stats.gather_schema_stats(ownname=>'hr');.net
收集模式中任何「過期」的表的統計信息
exec dbms_stats.gather_schema_stats(ownname=>'hr',options=>'gather stale');orm
查看統計信息狀態對象
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';