备份恢复表统计信息
在oracle中,统计信息是十分重要的,尤其在10g以后sql执行计划采用CBO后,表上的统计信息将直接影响CBO做出正确的执行计划。所以,我们对那些数据量较大,且其中的数据存在批量加载和删除的情形,我们一般建议在对该类表做完数据批量加载或删除之后,及时对其进行统计信息的收集,此刻,我们便可采用先将该类表之前的统计信息备份之后再次对其统计信息的收集,这样一来,即使新的统计信息存在问题,我们也可将之前的旧的统计信息恢复过去,以不至于造成表上没有统计信息的问题发生。下边,就是一个表上统计信息的备份和恢复的实例:
SQL> desc test.test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)
查看表分析时间
SQL> select to_char(last_analyzed,'yyyy/mm/dd hh24:mi:ss') from dba_tables where table_name='TEST' AND OWNER='TEST';
TO_CHAR(LAST_ANALYZ
-------------------
2012/08/21 00:32:23
--查看当前时间
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2012/09/28 08:21:58
创建统计信息存储表,收集表统计信息并将统计信息存储到存储表
SQL> BEGIN
2 DBMS_STATS.CREATE_STAT_TABLE ('test', 'savestats');
3 DBMS_STATS.GATHER_TABLE_STATS ('test', 'test', stattab => 'savestats');
4 END;
5 /
BEGIN
*
ERROR at line 1:
ORA-20002: Unable to create table SAVESTATS: already exists
ORA-06512: at "SYS.DBMS_STATS", line 7060
ORA-06512: at line 2
删除统计信息存储表
SQL> BEGIN
2 DBMS_STATS.DROP_STAT_TABLE ('test', 'savestats');
3 END;
4 /
PL/SQL procedure successfully completed.
创建统计信息存储表,收集表统计信息并将统计信息存储到存储表
SQL> BEGIN
2 DBMS_STATS.CREATE_STAT_TABLE ('test', 'savestats');
3 DBMS_STATS.GATHER_TABLE_STATS ('test', 'test', stattab => 'savestats');
4 END;
5 /
PL/SQL procedure successfully completed.
查看表分析时间
SQL> select to_char(last_analyzed,'yyyy/mm/dd hh24:mi:ss') from dba_tables where table_name='TEST' AND OWNER='TEST';
TO_CHAR(LAST_ANALYZ
-------------------
2012/09/28 08:25:33
查看当前时间
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2012/09/28 08:26:20
删除当前表统计信息,将表旧统计信息从存储表还原
SQL> BEGIN
2 DBMS_STATS.DELETE_TABLE_STATS ('test', 'test');
3 DBMS_STATS.IMPORT_TABLE_STATS ('test', 'test', stattab => 'savestats');
4 END;
5 /
PL/SQL procedure successfully completed.
查看表分析时间
SQL> select to_char(last_analyzed,'yyyy/mm/dd hh24:mi:ss') from dba_tables where table_name='TEST' AND OWNER='TEST';
TO_CHAR(LAST_ANALYZ
-------------------
2012/08/21 00:32:23