合 Oracle如何查询表和索引的历史统计信息
从Oracle 10g开始,当收集表的统计信息的时候,旧的统计数据被保留,如果因为新的统计信息而出现性能问题,旧的统计信息就可以被恢复。历史统计信息保存在以下几张表中:
- l WRI$_OPTSTAT_TAB_HISTORY 表的统计信息
- l WRI$_OPTSTAT_IND_HISTORY 索引的统计信息
- l WRI$_OPTSTAT_HISTHEAD_HISTORY 列的统计信息
- l WRI$_OPTSTAT_HISTGRM_HISTORY 直方图的信息
从视图DBA_TAB_STATS_HISTORY可以查询历史收集统计信息的时间,但是不能查询到行数,所以需要结合基表来查询,查询的SQL语句如下:
1 2 3 4 5 6 7 8 9 10 | SELECT B.OWNER, B.OBJECT_NAME TABLE_NAME, TO_CHAR(D.ANALYZETIME, 'YYYY-MM-DD HH24:MI:SS') LAST_ANALYZETIME, TO_CHAR(D.SAVTIME, 'YYYY-MM-DD HH24:MI:SS') CURR_ANALYZETIME, D.ROWCNT FROM SYS.WRI$_OPTSTAT_TAB_HISTORY D, DBA_OBJECTS B WHERE D.OBJ# = B.OBJECT_ID AND B.OBJECT_NAME IN ('TEST_STAT', 'TPCCBOKBAL_TMP', 'TPCCBOKBALJN', 'PK_TPCCBOKBAL') ORDER BY D.OBJ#, D.SAVTIME; |
查询索引的历史统计信息的SQL语句如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT B.OWNER, B.OBJECT_NAME INDEX_NAME, TO_CHAR(D.ANALYZETIME, 'YYYY-MM-DD HH24:MI:SS') LAST_ANALYZETIME, TO_CHAR(D.SAVTIME, 'YYYY-MM-DD HH24:MI:SS') CURR_ANALYZETIME, D.ROWCNT, D.BLEVEL, D.LEAFCNT, D.DISTKEY, D.CLUFAC FROM SYS.WRI$_OPTSTAT_IND_HISTORY D, DBA_OBJECTS B WHERE D.OBJ# = B.OBJECT_ID AND B.OBJECT_NAME IN ('IND_TEST') ORDER BY D.OBJ#, D.SAVTIME; |
默认情况下统计信息将被保留31天,可以使用下面的命令修改:
EXECUTE DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (XX); --xx是保留的天数