在Oracle10中表空间SYSAUX引入,oracle把统计信息存储在这里,这也是为了更好的优化system表空间,oracle的SM/AWR, SM/ADVISOR, SM/OPTSTAT,SM/OTHER的统计信息都存储在SYSAUX中。
查询SYSAUX表空间内各个分类项目占存储空间的比重:
SELECT occupant_name"Item",
round(space_usage_kbytes/1024/1024,3)"Space Used (GB)",
schema_name "Schema",
move_procedure "MoveProcedure"
FROM v$sysaux_occupants
ORDER BY 2 Desc;
可以看到SM/OPTSTAT占了大部分空间。
SM/OPTSTAT:用于存储老版本的优化统计信息,在oracle10g中,在我们手动或自动更新统计信息使oracle选择了错误的执行计划。oracle10g是可以恢复旧版本的统计信息,这个统计信息默认保存31天
查询当前SM/OPTSTAT的统计信息的保存时间:
select dbms_stats.get_stats_history_retention from dual;
修改SM/OPTSTAT的统计信息的保存时间为10天:
exec dbms_stats.alter_stats_history_retention(10);
查看当前有效的统计数据是到什么时间的:
select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual;
删除7天前的统计数据:
exec dbms_stats.purge_stats(sysdate-7);
这个时候虽然删除了数据,但空间还没有回收,如何回收空间呢?没有释放空间是因为“purge_stats”用delete的方式删除数据,虽然数据没了,但是HWM还没降下来,查看OPTSTAT使用哪些表,然后降低其高水位即可。
SELECT s.object_name from dba_objects s where s.object_name like '%OPTSTAT%' and s.object_type='TABLE'
再结合如下sql判断哪个表大,然后就move哪个表
select a.table_name,a.num_rows from dba_tables a where a.tablespace_name='SYSAUX' and a.table_name like '%OPTSTAT%'
再用如下语句查出相关表的索引,因为move表,索引会失效,需要重建索引
select i.index_name,i.table_name,i.status,i.table_owner
2 from dba_indexes i,dba_objects s where i.table_name=s.object_name and s.object_name like '%OPTSTAT%' and s.object_type='TABLE'
降低HWM
alter table @TABLE_NAME move;#把@TABLE_NAME改为需要move的表
重建索引
alter index @INDEX_NAME rebuild online;#把@INDEX_NAME改为上步表关联的索引
如果索引编译不成功,就要create indexe
用如下语句生成DDL语句
set long 4000
select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_IND_OBJ#_ST','SYS') from dual;
select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_TAB_ST','SYS') from dual;
参考:
http://blog.sina.com.cn/s/blog_b56640170102xbj6.html
https://blog.51cto.com/dingren/1177052