9i引入了assm技术,freelist被位图取代。在assm管理下,insert通过扫描位图来查找可用的block,即使block可用空间低于PCTFREE,也不会从位图中剔除(mssm中,块会被剔除freelist),所以PCTUSED不再需要。而PCTFREE还是需要的,需要它指示需要保留多少空间来给后续update增长使用,freelist和freelist group也无效了。
新的机制用位图数组来跟踪和管理分配的块,每个块剩余多少空间根据位图的状态来确定,如>75%,50%-75%,25%-50%,<25%。也就是位图用了4个状态来替代了之前的PCTUSED。
ASSM的一个大优势是位图数组能减轻缓冲区等待(buffer busy wait)的负担。解决了mssm如果只有一个freelist,频繁段操作造成的争用。
有了ASSM后,oracle宣称显著提升了DML并发操作性能,因为位图数组的不同位置可以被同时使用,消除了寻找剩余空间的串行化。使用位图数组可显著消除所有对段头的竞争,还能超快并发插入。
查看表空的段管理方式
SELECT tablespace_name, extent_management, allocation_type,segment_space_management FROM dba_tablespaces;
LALA表空间本地管理,assm
EYGLE表空间本地管理,mssm
查看assm的表空间(hex_block_id是16进制块号,转成10进制就是block_id)
select segment_name,file_id,block_id, to_char(block_id,‘xx’) hex_block_id,blocks from dba_extents where tablespace_name=‘USERS’;
11g中,0-1号块是数据文件头,2-127号块是位图块,第一个位图块是位图头。
第三级位图块(:L3)
第二级位图块(SECOND LEVEL BITMAP BLOCK:L2)
第一级位图块(FIRST LEVEL BITMAP BLOCK:L1)
可以查看上图块的转储
alter system dump datafile 4 block 176;
select value from v$diag_info where name like ‘De%’;
这个位图管理了16个block,地址从0x01400090开始(就是),前3个block(0-2)存储元数据,其余用来存储数据,full表示块已经用完了,unformatted是未使用,这是第一级位图块(FIRST LEVEL BITMAP BLOCK:L1)
当对象空间超过16个块后,要分配更多的L1位图块管理block,而L1也需要管理,所以引出了L2,最多支持L3。
父位图的地址为0x010000b1,b1为第177个bolck(如果是0a,就是第10个block,16进制转10进制)
type: 0x20=FIRST LEVEL BITMAP BLOCK看出是L1
查看到176号blcok是L1,它的L2是177号block,我们查看177号的转储文件
直接跑的话会在老的trc里添加,建议退出sqlplus再进再跑
alter system dump datafile 4 block 177 ;
select value from v$diag_info where name like ‘De%’;
根据下图可以看到,
177号块是二级位图块(DUMP OF SECOND LEVEL BITMAP BLOCK:L2)
L1 ranges是它管理的一级位图块的地址
pdba是它的父位图0x010000b2,也就是178号块
type: 0x21=SECOND LEVEL BITMAP BLOCK看出是L2
查看178号块(L3)
alter system dump datafile 4 block 178 ;
select value from v$diag_info where name like ‘De%’;
type: 0x23=PAGETABLE SEGMENT HEADER看出是L1
在段头(segment header)分配自由列表(freelist)来管理block。简单理解,把自由列表想成一个数据表,通过算法,想自由列表加入或移出block来实现空间管理。
当创建对象(比如表)的时候可以自定义freelist的数量,表的缺省freelist为1,可以通过dba_segments查询到。
select SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from DBA_SEGMENTS where TABLESPACE_NAME=‘BB’;
当向对象中插入数据时,会在该对象的段头中的freelist上寻找可用插入数据的block,当一个block用完后,会从freelist上剔除,如果该block上由数据删除等原因空间释放了,可以再次回到freelist中,主要是通过存储参数PCTFREE和PCTUSED实现。
当向一个对象中插入数据时,PCTFREE=20,PCTUSED=40,表示当一个block的空间使用率到80%时,这个block不再允许用于新增数据(insert),而保留的20%被预留为行更新(update)所可能使用到的空间扩展,此时这个block从freelist上剔除。如果这个block上数据被删除(delete),空间被释放,空间使用低于PCTUSED的参数(此处为40%),这个数据库才能重新备加入freelist,又可以被插入新数据。
一个段操作频繁,多用户同时请求访问freelist,并对freelist进行修改,容易产生竞争。比如对于表来说,缺省的freelist为1就很容易产生竞争,虽然可以添加freelist来缓解,但是看到了这种管理方式的缺陷。推出了ASSM。
9i引入ASSM技术,freelist被位图取代
本文从Oracle内核技术揭秘_吕海波中理解