全部博文(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的功能实在是太强大了.