oracle assm(自动段管理)与mssm(手动段管理)的区别

1.assm(Automatic Segment Space Management自动分段空间管理)

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
oracle assm(自动段管理)与mssm(手动段管理)的区别_第1张图片

查看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’;
oracle assm(自动段管理)与mssm(手动段管理)的区别_第2张图片

11g中,0-1号块是数据文件头,2-127号块是位图块,第一个位图块是位图头。

第三级位图块(:L3)
第二级位图块(SECOND LEVEL BITMAP BLOCK:L2)
第一级位图块(FIRST LEVEL BITMAP BLOCK:L1)
oracle assm(自动段管理)与mssm(手动段管理)的区别_第3张图片

判断从哪个块插入的步骤
oracle assm(自动段管理)与mssm(手动段管理)的区别_第4张图片
oracle assm(自动段管理)与mssm(手动段管理)的区别_第5张图片

可以查看上图块的转储
alter system dump datafile 4 block 176;

select value from v$diag_info where name like ‘De%’;
oracle assm(自动段管理)与mssm(手动段管理)的区别_第6张图片

这个位图管理了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
oracle assm(自动段管理)与mssm(手动段管理)的区别_第7张图片
oracle assm(自动段管理)与mssm(手动段管理)的区别_第8张图片

查看到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
oracle assm(自动段管理)与mssm(手动段管理)的区别_第9张图片
oracle assm(自动段管理)与mssm(手动段管理)的区别_第10张图片

查看178号块(L3)
alter system dump datafile 4 block 178 ;

select value from v$diag_info where name like ‘De%’;

记录了L2的地址,如果不足以存储L2,就会新建L3
oracle assm(自动段管理)与mssm(手动段管理)的区别_第11张图片

type: 0x23=PAGETABLE SEGMENT HEADER看出是L1
oracle assm(自动段管理)与mssm(手动段管理)的区别_第12张图片

如果由于L2不够放了,生产了第二个L3
oracle assm(自动段管理)与mssm(手动段管理)的区别_第13张图片
oracle assm(自动段管理)与mssm(手动段管理)的区别_第14张图片

删除一些数据,再看block
oracle assm(自动段管理)与mssm(手动段管理)的区别_第15张图片

2.mssm(Manual Segment Space Management手动分段空间管理)

在段头(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’;
oracle assm(自动段管理)与mssm(手动段管理)的区别_第16张图片

当向对象中插入数据时,会在该对象的段头中的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内核技术揭秘_吕海波中理解

你可能感兴趣的:(oracle内核,oracle,oracle,数据库)