ORACLE表空间优化
FSFI
1 |
|
上述sql 可查询FSFI(free space fragmentation index 空闲空间碎片索引)来作为表空间碎片参考,普遍认为100为理想值,低于30则碎片过多。但仅适用于表空间管理方式为DMT(dictionary managed tablespace 字典管理)的情况。
DMT表空间碎片
oracle数据存储概念:tablespace -> segment -> extent -> block
字典管理的表空间,segment 中分配的extent 大小不一,反复创建、回收对象后,存留一些极小的空闲extent 无法再被利用,产生气泡碎片。
表空间碎片的影响:
- 空间浪费。
- 性能问题。DMT 每次分配extent 时需要扫描UET$、FET$ 两张数据字典表,寻找可用大小的空间,碎片越多,意味着分配速度越慢。
可用以下sql 合并碎片空间:
1 |
|
LMT提高FSFI
LMT 即 locally managed tablespace 本地管理,oracle 9i 以后默认为LMT。
LMT 管理机制与DMT 不同,LMT在表空间的数据文件头部加入了一个位图区域,在其中记录每个extent的使用状况,分配的extent 大小统一(uniform 下均为给定值; autollocate 系统自动分配,64K、1M、8M……),不存在表空间碎片,FSFI 对LMT 无参考意义。
但是可以想办法提高FSFI 的值。
分析FSFI 的sql 可知,FSFI 本质上是计算最大空闲extent 占所有空闲extent 的块(block)的比例,想办法让extent 数量变少、分配的block 连续即可。
回收站清除
分析测试库的DBA_FREE_SPACE 发现一个现象:很多空闲block 的id 连续,但不属于同一个extent。原因是回收站中还有该表空间的驻留对象,对其进行清除,可提高FSFI:
1 |
|
重建表空间
表空间新建时没有频繁创建、销毁对象,也就不存在大量空间分配行为,此时extent 完整且连续。
可将原表空间数据导出,新建一个表空间后再导入
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|