手工和自动管理
1.段空间管理
手工空间管理:通过列表结构来记录数据块的空间使用情况叫做free list;需要几个参数
pctfree定义数据块中空闲空间的百分比
pctused定义数据块中被使用的的空间百分比
freelists定义每个段使用的空闲列表数量
问题:free list的竞争使用带来了性能问题,segment header使用一个数据块来保存free list,每执行一个DML操作必须先获得freelist,并且以排他得方式使用,因此并发DML会导致大量对segment header block的竞争,表现为buffer busy wait事件,在RAC环境中尤为明显。
因此9i开始引入自动空间管理的方式
自动空间管理automatic storage space management ASSM,不再使用freelist来记录空闲数据块,而是通过“位图”来记录每个数据块的使用情况,每个数据块oracle使用4bit来描述数据块的空闲使用情况,
用来记录数据块使用的位图的数据块叫做bitmapped block (BMB),和手工管理缺省只有1个free list block不同,BMB有多个块,并且是分级、分散在extents中,大大减少了竞争,尤其在RAC中,减少了buffer busy wait事件
使用ASSM,只剩下pctfree仍然有用,这是因为pctfree所定义的空间是用于更新操作时的记录扩展,而不是用于数据插入。
oracle提供dbms_space包查看空间使用情况
2.区空间管理
字典管理directory managed tablespace DMT,本地管理local managed tablespace LMT 区别在于Oracle是如何记录extents的使用信息的。
DMT:
oracle使用了2个数据字典来记录extents的使用情况 sys.fet$记录空闲的extents,sys.uet$记录使用的extents.分配extents时,从fet$删除增加到uet$,释放过程相反.
每个动作都是一个事务,需要获得ST (space transaction) Enqueue Latch进行事务保护.一个时刻只能有一个进程获得这个锁.因此字典管理问题很容易出现导致大量递归SQL调用Recursive SQL及出现竞争问题,性能变差.
而且对于2个字典的本质也是DML操作,也会产生undo记录,还要不断地进行空间合并(这个过程叫做coalescing,通过SMON进程完成).
LMT:
通过在数据文件头的一个bitmap来记录本文件中数据块的使用情况,bitmap中每个bit代表着一组数据块,当一个extents被分配或者释放时,oracle改变bit值来反映变化,这种变化没有更改任何数据记录,不数据DML,不产生undo记录
create tablespace ts_01 datafile '/u01/app/oracle/oradata/ts_01.dbf' size 20M extent management local segment space management auto;
在ORACLE中推荐使用ASSM & LMT