前言
有时候统计信息的改变不一定会提升SQL执行效率,相反可能会大幅降低执行效率。如果我们不想再次收集新的统计信息,Oracle可以恢复到某一时刻的旧统计信息,下面我们来看看如何恢复吧!
一些关于统计信息的SQL语句参考:
1.【TUNE_ORACLE】检查统计信息是否过期SQL参考: http://blog.itpub.net/69992972/viewspace-2785127/
2.【TUNE_ORACLE】定制化收集统计信息SQL参考: http://blog.itpub.net/69992972/viewspace-2784605/
3.【TUNE_ORACLE】查看表,列和索引的统计信息SQL参考: http://blog.itpub.net/69992972/viewspace-2784114/
实验环境
搭建平台:VMware Workstation
OS:OL 6.10
DB:Oracle 11.2.0.4
恢复方法
1. 设置统计信息保留时间
和AWR、备份一样,统计信息也有自己的保留时间,我们可以根据实际需要来设置(默认31天):
exec DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (天数);
比如我们保留60天:
exec DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (60);
我们来查看下当前的保留天数,和最早能恢复到的时间:
SQL> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual;
GET_STATS_HISTORY_RETENTION
---------------------------------------------------
60 ##已经修改成保留60天了
SQL> select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual;
GET_STATS_HISTORY_AVAILABILITY
------------------------------------------------------------------------------
19-NOV-22 04.52.41.089721000 PM +8:00 ##这里由于之前是31天保留时间,所以就算更新到60天,也不会找到比这个时间更老的数据了,因为已经覆盖了。
2. 恢复统计信息
有几种恢复统计信息的方式:
(1)恢复表的统计信息 (最常用!)
SQL> exec DBMS_STATS.RESTORE_ TABLE_STATS ('owner','table',date)
举例:
SQL> exec dbms_stats.restore_table_stats ('TEST','TBS','19-NOV-22 04.52.41.089721000 PM +8:00');
(2)恢复用户的统计信息(较常用)
SQL> exec DBMS_STATS.RESTORE_ SCHEMA_STATS('owner',date)
(3)恢复数据库的统计信息
SQL> exec DBMS_STATS.RESTORE_ DATABASE_STATS(date)
(4)恢复数据字典的统计信息
SQL> exec DBMS_STATS.RESTORE_ DICTIONARY_STATS(date)
(5)恢复基表(X$)的统计信息
SQL> exec DBMS_STATS.RESTORE_ FIXED_OBJECTS_STATS(date)
(6)恢复system的统计信息
SQL> exec DBMS_STATS.RESTORE_ SYSTEM_STATS(date)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69992972/viewspace-2928936/ ,如需转载,请注明出处,否则将追究法律责任。