手记

管理Oracle统计信息


 在CBO(基于代价的优化器模式)条件下,SQL语句的执行计划由统计信息来决定,若没有统计信息则会采取动态采样的方式决定执行计划!可以说统计信息关乎sql的执行计划是否正确,属于sql执行的指导思想,oracle的初始化参数statistics_level控制收集统计信息的级别,有三个参数值:

BASIC :收集基本的统计信息

TYPICAL:收集大部分统计信息(数据库的默认设置)

ALL:收集全部统计信息

 

统计信息包含:

行统计信息(user_tables):行数(NUM_ROWS),块数(BLOCKS),行平均长度(AVG_ROW_LEN);

列统计信息(user_tab_columns):列中唯一值的数量(NUM_DISTINCT),NULL值的数量(NUM_NULLS),数据分布(HISTOGRAM);         

索引统计(user_index):--叶块数量(LEAF_BLOCKS),等级(BLEVEL),聚簇因子(CLUSTERING_FACTOR);

 

统计信息的收集时间由时间窗口来调度!

 一:10g关闭自动收集统计信息任务

begin 

 DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB'); 

end; 

二:11g关闭自动收集统计信息任务

BEGIN 

DBMS_AUTO_TASK_ADMIN.DISABLE( 

client_name => 'auto optimizer stats collection', 

operation => NULL, 

window_name => NULL); 

END; 

查询

SQL> select client_name ,status from dba_autotask_client; 

 

CLIENT_NAME                                                      STATUS 

 

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

 

auto optimizer stats collection                                  DISABLED 

 

auto space advisor                                               ENABLED 

 

sql tuning advisor                                               ENABLED 

三:手动收集统计信息,采样10%,并行度为8,METHOD_OPT选项代表收集index列分布情况,并生成直方图

BEGIN 

dbms_stats.gather_schema_stats( 

ownname=>'HR', 

METHOD_OPT=>'FOR ALL INDEXED COLUMNS SIZE SKEWONLY', 

CASCADE=>TRUE, 

ESTIMATE_PERCENT=>10, 

DEGREE=>8); 

END; 

四:查看表或索引的统计信息

select table_name,  

       last_analyzed,  

       num_rows,  

       avg_row_len,  

       row_movement, 

       monitoring 

from dba_tables 

where owner = 'HR'; 

 

select index_name, 

       table_name, 

       blevel, 

       status, 

       clustering_factor, 

       last_analyzed, 

       num_rows, 

       leaf_blocks, 

       distinct_keys, 

       avg_leaf_blocks_per_key 

from dba_indexes 

where owner = 'HR'; 

五:导出统计信息

begin 

  dbms_stats.create_stat_table(ownname => 'HR', 

  stattab => 'HR_STAT_BAK'); 

end; 

 

begin  

  dbms_stats.export_schema_stats(ownname => 'HR', 

  stattab => 'HR_STAT_BAK', 

  statid => 'N1', 

  statown => 'HR'); 

end; 

 

select * from HR_STAT_BAK; 

六:删除统计信息

begin 

  dbms_stats.delete_schema_stats(ownname => 'HR'); 

end; 

七:导入统计信息

begin 

  dbms_stats.import_schema_stats(ownname => 'HR', 

  stattab => 'HR_STAT_BAK', 

  statid => 'N1', 

  statown => 'HR'); 

end; 

八:异机导入,首先需要将HR_STAT_BAK表通过expdp/impdp方式导入到其他oracle服务器上

SQL> exec dbms_stats.upgrade_stat_table('HR','HR_STAT_BAK'); 

PL/SQL 过程已成功完成。 

 

SQL> EXEC dbms_stats.import_schema_stats(ownname => 'HR',stattab => 'HR_STAT_BAK',statid => 'N1',statown=>'HR'); 

PL/SQL 过程已成功完成。 

九:锁定与解锁统计信息

1:锁定统计信息 

begin 

 dbms_stats.lock_schema_stats(ownname=>'HR'); 

end; 

 

2:查询哪些表或索引的统计信息被锁定 

select * from user_tab_statistics where stattype_locked='ALL'; 

select * from user_ind_statistics where stattype_locked='ALL'; 

 

3:如果在锁定条件下收集统计信息,则会出现如下报错 

ERROR at line 1: 

ORA-20005: object statistics are locked (stattype = ALL) 

ORA-06512: at "SYS.DBMS_STATS", line 20337 

ORA-06512: at "SYS.DBMS_STATS", line 20360 

ORA-06512: at line 1 

 

4:解锁统计信息 

begin 

 dbms_stats.lock_schema_stats(ownname=>'HR'); 

end; 

 

 

©著作权归作者所有:来自51CTO博客作者ylw6006的原创作品,谢绝转载,否则将追究法律责任

oraclestatisticsOracle


0人推荐
随时随地看视频
慕课网APP