日期:2014-05-16 浏览次数:20544 次
统计信息是个非常有用的东东,没有它,SQL优化器就好比巧妇难为无米之炊!良好高效的SQL执行计划依赖于真实的统计信息。然而在有些情况下,比如对比生产环境与测试环境执行计划,需要使用生产环境的统计信息。而有时候呢则需要还原Oracle历史统计信息。本文基于后者即如何还原历史统计信息来展开,同时描述了11g缺省情况下对于统计信息的调度。
有关统计信息的导入导出可以参考:
dbms_stats 导入导出 schema 级别统计信息
dbms_stats 导入导出表统计信息
1、演示环境
sys@MMBO> select * from v$version where rownum<2; BANNER ----------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production --查看schema HR上对象的最后analyze 的时间(注,为简化页面,部分输出行省略,下同) sys@MMBO> select table_name,last_analyzed from dba_tables where owner='HR'; TABLE_NAME LAST_ANALYZED ------------------------------ ----------------- REGIONS 20130815 18:03:55 LOCATIONS 20130815 18:03:55 DEPARTMENTS 20130815 18:03:56 JOBS 20130815 18:03:56 --创建用于存放导出统计信息的表STATS_TABLE sys@MMBO> exec dbms_stats.create_stat_table('HR', 'STATS_TABLE'); PL/SQL procedure successfully completed. --导出schema HR此时的统计信息 sys@MMBO> exec dbms_stats.export_schema_stats('HR','STATS_TABLE','HR'); PL/SQL procedure successfully completed. -- Author : Leshami -- Blog : http://blog.csdn.net/leshami --此时收集整个schema的统计信息 sys@MMBO> exec dbms_stats.gather_schema_stats('HR'); PL/SQL procedure successfully completed. --收集之后,对象的LAST_ANALYZED变为20140307 sys@MMBO> select table_name,last_analyzed from dba_tables where owner='HR'; TABLE_NAME LAST_ANALYZED ------------------------------ ----------------- STATS_TABLE 20140307 10:26:31 REGIONS 20140307 10:26:30 LOCATIONS 20140307 10:26:30 DEPARTMENTS 20140307 10:26:29
2、统计信息保留的时效性及可用性
--可以保留31天以内统计信息 sys@MMBO> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual; GET_STATS_HISTORY_RETENTION --------------------------- 31 --最久的历史可用统计信息为03-FEB-14 sys@MMBO> select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual; GET_STATS_HISTORY_AVAILABILITY --------------------------------------------------------------------------- 03-FEB-14 10.28.31.948055000 PM +08:00
3、还原历史统计信息
--使用下面的过程来还原历史统计信息,注意以下演示的是还原schema级别的历史统计信息 sys@MMBO> exec dbms_stats.restore_schema_stats('HR',sysdate-1); PL/SQL procedure successfully completed. --查看还原之后scheme HR上对象的LAST_ANALYZED时间,这个与收集统计信息之前是一致的 --尽管我们指定了sysdate-1,但实际上昨天的历史统计信息的最后analyzed 也是20130815,也就是说很久没有analyze过了 sys@MMBO> select table_name,last_analyzed from dba_tables where owner='HR'; TABLE_NAME LAST_ANALYZED ------------------------------ ----------------- STATS_TABLE 20140307 10:26:31 REGIONS 20130815 18:03:55 LOCATIONS 20130815 18:03:55 DEPARTMENTS 20130815 18:03