数据库运行了一段时间,经过一些列的删除、插入、更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩;
2 查找高水位线的表a) 查找表需要的存储空间:表以数据块的形式存储在数据文件中,表的存储结构是:行×行数,如果知道了总共有多少行,每行的平均长度,两者相乘,再除于90%的使用率,那么就可以知道实际需要存储的空间;
表的存储结构;
|
|
|
|
|
|
|
|
| ||||||||||||||||
|
|
|
|
|
|
|
|
| ||||||||||||||||
|
|
|
|
|
|
|
|
| ||||||||||||||||
|
|
|
|
|
|
|
| |||||||||||||||||
从统计信息得出平均每行的长度和总共的行数,从而知道存储的SIZE;
b) 查找表实际存储的空间:数据实际存储在数据文件中是以块的形式存储的,每个数据文件8K,块的数量乘于8k,就可以知道实际已经存储的空间是多少了;
c) 查找数据库中某个表空间下,可以实际存储和需要的表空间差别最大的表,查找脚本如下:
SELECT NUM_ROWS,AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9 NEED,BLOCKS*8/1024 TRUE,(BLOCKS*8/1024-AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9)RECOVER_MB,TABLE_NAME
FROM dba_tables
WHERE tablespace_name='PSAPSR3' AND BLOCKS*8/1024-AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9>100
AND rownum<11 order by RECOVER_MB desc;
3 统计信息的更新因为所有的信息都是根据dba_tables,表的信息是根据统计信息得到的,所以如果统计信息不准确,那么整个搜索的结果都可能是错误的;
统计信息的脚本:exec dbms_stats.gather_table_stats('user','table_name');
4 回收的操作a) 启动行迁移:alter table table_name enable row movement ;
b)进行表的收缩:alter table table_name shrink space ;
5 检查结果SQL> select t.table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS
from user_tables
where table_name = upper('table_name');
6 操作经验以上操作需要在系统的空闲窗口执行,已经多次对公司内部的系统进行各种瘦身操作,效果最明显的有两次
1、对PI数据库的回收,从2.8TB空间收缩到600GB的空间,效果,整个收缩过程持续了一个月的时间;
2、对ECP表TST03的收缩,该表从720GB回收到12GB,堪称效果明显;
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论