关于ORACLE碎片的理解和解决办法

ORACLE数据库是有TABLESPACE、SYSTEMSPACE和TEMPSPACE三部分表空间组成。
在表空间下包含若干的段(SEGMENT),在段下包含若干的范围(EXTENT)和
FREESPACE.在存储数据时,段会首先为自己初始化存储位置的范围,以便存
储和寻找,并将存储位置的这段范围标记为1。

因为存储数据的时候,段总是为自己寻找最大的范围,方便存储和寻找,
在频繁的数据存储过后,范围和范围之间的狭小地带就存在了冗余范围,
当段再为自己寻找最大的范围时,就要从众多的范围中寻找给自
己的最大空隙范围,可想而知这个最大空闲范围的寻找要经过怎样漫长的遍历,
因此在数据频繁的更新之后,空间中的冗余空间碎片将会有很多的。

针对存储的原理和特性可以用以下办法解决:

1、将范围标志都设置为1,因为SMON会周期性的自动将标志相同的位置合并为
自己的最大范围,这样就减少了冗余碎片,提高了数据寻址的效率和存贮效率。
改为1自动合并:alter tablespace users default storage(pctincrease 1)
手动合并: alter tablespace users coalesce

2、将数据压缩到一个范围的简单的方法是用正确的存贮参数将这个段重建,然后
将旧表中的数据导入新表中,并将旧表删除。用EXPORT/IMPORT 能实现这个目的。
先exp dps/dps file=MESDB.dmp compress=Y grants=Y indexes=Y
然后再IMPORT进去。导出的表就是重建后最新的表和数据,范围也将是最大的范围。


 

原文地址:https://www.cnblogs.com/doc/p/1353465.html