Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2802806
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Oracle

2013-12-07 11:27:50

                                Optimizer的分区统计信息导入和导出

       很多业务库都有在线表和历史表,业务按某种业务规则进行分区了.在历史表很大的时候,收集统计信息会是一个很耗
时的操作,虽然可能增量更新 ,但是在线表上已经有统计信息了,我们直接可能利用optimizer的统计信息的导出和导入功能
来减少统计信息的收集

  比如有在线表T1和历史表T1_HIS,每天会自动把T1的分区移动到T1_HIS.先创建统信息存放的表

SQL> begin
  2    dbms_stats.create_stat_table(ownname=>'FRANK',stattab=>'T_STAT');
  3  end;
  4  /

PL/SQL procedure successfully completed.


导出在线表的分区到统计信息表中
SQL> begin
  2    dbms_stats.export_table_stats(ownname=>'FRANK',
  3                                 tabname=>'T1',
  4                                 partname=>'P20131205',
  5                                 stattab=>'T_STAT',
  6                                 statown=>'FRANK');
  7  end;
  8  /

PL/SQL procedure successfully completed.

导入统计信息到历史表中

SQL> begin
  2    dbms_stats.import_table_stats(ownname=>'FRANK',
  3                                 tabname=>'T_HIS',
  4                                 partname=>'P20131205',
  5                                 stattab=>'T_STAT',
  6                                 statown=>'FRANK');
  7  end;
  8  /

PL/SQL procedure successfully completed.

对于这种已经有了统计信息的历史表,在收集的时候,我们可能需要把这个表排除掉,dbms_stats提供了对像的过滤功能.比如我们要排除T1_HIS表

SQL> declare
  2  exelist dbms_stats.objecttab:=dbms_stats.objecttab();
  3  begin
  4    exelist.extend(1);  --可以定义多个元素
  5    exelist(1).ownname:='FRANK';
  6    exelist(1).objname:='T1_HIS';
  7    dbms_stats.gather_schema_stats(ownname=>'FRANK',obj_filter_list=>exelist);
  8  end;
  9  /
PL/SQL procedure successfully completed.

  通过dbms_stats的这种导入导出功能,在某些情况下,我们可以避免一些统计信息的收集,从而使整个统计信息过程可以快速的完成,提高了
效率,另外dbms_stats还提供了一个copy_table_stats功能,可以在表内的分区之前拷贝统计信息,如果可以确定分区的统计信息类似,可以
使用这个功能来减少统计信息的收集.dbms_stats的功能实在是太强大了.

阅读(2396) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~