ITPub博客

首页 > 数据库 > Oracle > oracle assm(自动段管理)与mssm(手动段管理)的区别

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

原创 Oracle 作者:wanglinghua0907 时间:2024-01-17 11:27:01 0 删除 编辑

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

TABLESPACE_NAME SYSTEM SYSAUX UNDOTBSI TEMP USERS 88 LALA EYGLE EXTENT_MAN ALLOCATIO SEGMEN LOCAL LOCAL LOCAL LOCAL LOCAL LOCAL LOCAL LOCAL SYSTEM SYSTEM SYSTEM UNIFORM SYSTEM SYSTEM SYSTEM UNIFORM MANUAL AUTO MANUAL MANUAL AUTO AUTO AUTO MANUAL


查看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'; 

SEGMENT -NAME PK_DEPT TEST TEST TEST TEST TEST TEST TEST TEST SEGMENT -NAME TEST TEST TEST TEST TEST TEST TEST FILE_ID FILE_ID BLOCK-ID HEX 152 98 136 88 176 192 200 208 216 224 232 240 BLOCK-ID HEX 248 256 264 272 28a 288 296 BLOCKS BLOCKS


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


第三级位图块(:L3)

第二级位图块(SECOND LEVEL BITMAP BLOCK:L2)

第一级位图块(FIRST LEVEL BITMAP BLOCK:L1)

L2 块 匚 00 匚 《 」 00 」 图 卜 2 ASSM 的 整 体 结 构


判断从哪个块插入的步骤

Oracle 是 如 何 使 用 4 层 树 状 结 构 ( 3 层 位 图 块 + 数 据 块 ) 来 确 定 向 哪 个 块 中 插 人 的 呢 ? 第 一 步 , 查 找 数 据 字 典 ( 就 是 dba_segments 数 据 字 典 视 图 的 基 表 ) , 确 定 段 头 位 置 。 第 二 步 , 在 段 头 中 找 到 第 一 个 L2 块 位 置 信 息 。 第 三 步 , 到 L2 块 中 根 据 执 行 插 人 操 作 进 程 的 PID 号 , 做 HASH 运 算 , 得 到 一 个 随 机 数 N , 在 L2 中 , 找 到 第 N 个 L ] 块 的 位 置 信 息 。 第 四 步 , 到 第 三 步 中 确 定 的 凵 块 中 , 再 根 据 执 行 插 人 操 作 进 程 的 PID 号 , 做 HASH 运 算 , 得 到 一 个 随 机 数 M, 在 凵 中 找 到 第 M 号 数 据 块 。 第 五 步 , 向 第 M 号 数 据 块 中 插 人 。 L3 块 中 虽 然 可 以 有 多 个 L2 块 , 但 插 人 操 作 不 会 选 择 多 个 L2 块 , 每 次 只 会 选 择 同 一 个 L2 块 。 直 到 这 个 L2 块 下 面 的 所 有 数 据 块 都 被 插 满 了 , 才 会 选 择 下 一 个 L2 块 。 在 L2 中 选 择 某 个 凵 的 时 候 , 就 是 随 机 的 了 。 不 同 Session , 只 要 有 可 能 , 就 会 被 分 配 到 不 同 的 凵 中 。 在 Ll 中 找 数 据 块 时 也 是 一 样 。

SEGMENT -NAME PK_DEPT TEST TEST TEST TEST TEST TEST TEST TEST SEGMENT -NAME TEST TEST TEST TEST TEST TEST TEST FILE_ID FILE_ID BLOCK-ID HEX 152 98 136 88 176 192 200 208 216 224 232 240 BLOCK-ID HEX 248 256 264 272 28a 288 296 BLOCKS BLOCKS


可以查看上图块的转储

alter system dump datafile 4 block 176;


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

SQL* alter system System altered. SQL> select value VALUE dump f rom datafile 4 block 176: vSdiag_info where name like /tmp / soft/ app 'oracle/ diag/ rdbms/wlh trace t rc


这个位图管理了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

Start dump data blocks tsn: 4 file#:4 minblk 176 maxblk 176 Block dump from cache Dump of buffer cache at level 4 for tsn=4 rdba= 16777392 BH (Ox78bdbdfB) file#: 4 rdba: exelaeeeba (4/176) class: 8 set: 5 pool: 3 bsz. 8192 bsi: e sflg: 1 pwc: 18,28 dbwrid: e obj . 87427 objn: 87427 tsn: 4 afn: 4 hint: f hash: [Ox86beab18, ex974439a01 Iru: [ex78bdc018, ax793dfde81 ex7889caøe ckptq: [NULLI fileq: [NULL] objq: [ex78bdb548, ex78bdc04e] objaq: [ex78bdc05e, ax793dfd4el st: XCURRENT md: NULL fpin: ' ktspfwh6: ktspffbmb' tch: 1 flags: LRBA: [axe.e.0J LSCN: [Oxe.01 HSCN: [Oxffff.ffffffffl HSUB: [28] Block dump from disk. buffer tsn: 4 rdba: exe100eeb0 (4/176) scn: . ee1745bc seq : frmt: exe2 chkval: Oxd7d6 type: ex20=FIRST LEVEL BITMAP BLOCK Hex dump of block: st=e, typ_ oun -1 Dump of memory from exee002B45E2F85Aee to exooee2B45E2F87Aeo 2345E2F85Aee eooeA22e mooeeB0 eel 745Bc eaeaaeee [ . 2845E2F85A1e eaeeD7D6 eeaeøeea geaaeøee egeeaeee [ .

Dump of First Level Bitmap Block nbits : 4 nranges: 2 unformatted: e owning instance total : parent dba: axel Oeeebl poffset It-st use ul ock: 3 instance ownership changed Last successful Search Freeness Status: nfl 0 at nf2 e nf3 e nf4 e Extent Ma Block Offset: 4294967295 First free datablock .16 map oc Locker xid: c opco e exooe3.001. eooee465 Dealloc scn: 3.0 Flag: oxeeeooeee (-1-/-/-/-/-) Inc # : e Objd: 87427 DBA Ranges exal eeoebe exal eeoeb8 a: Metadata Length: 8 Length: 8 Offset Offset 1 :Metadata :Metadata 8 :FULL 12 :FULL 13 :FULL End dump data blocks le:FULL 11 :FULL 14 :FULL 15:FULL tsn: 4 file#: 4 minblk 176 maxblk 176


查看到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

Start dump data blocks tsn: 4 minblk 177 maxblk 177 Block dump from cache: Dump of buffer cache at level 4 for tsn=4 rdba -16777393 BH (ex79becb48) file#: 4 rdba: Oxeleaeebl (4/177) class: 9 ba: set: 6 pool: 3 bsz: 8192 bsi: e sflg: 1 pwc : 24,28 dbwrid: 0 obj: 87427 objn: 87427 tsn: 4 afn: 4 hint: f hash: [ex867e93fe, Ox97afe66eJ Iru: [ex793ea2c8, ex793e9cbe] ex79a56eoo ckptq: [NULL] fileq: [NULL] objq: [ex793e9ea8, ex78fe8a9e] objaq: [ex6aeeb098, ex793e9ce8] st: XCIJRRENT md: NULL fpin : ktspswh4: ktspfsbmb• tch: 1 flags: LRBA: lexo.e.01 LSCN: [exe .el HSCN: [exffff.ffffffff] HSIJB: [261 Block dump from disk: buffer tsn: 4 rdba: Ox01eeaeb1 (4/177) son: 745bc seq 4 4 frmt: oxez chkval: exd331 type: ex21-SECOND LEVEL BITMAP BLOCK Hex dump of block: st-g, typ_ ound=l Dump of memory from Ox0ee0231CE645AA0e to CE645CAee 2BICE645AAOO ee00A221 01eeaeB1 0017453c 041 Aeeoa [ ! . 2BICE645AAIO ee00D331 eeeeeeee aeeeeeee eaeeeeae [1 2BICE645AA20 eeaaeeea eeeeeeee aeeeeaee eaeeeeae [

Repeat 489 times Dump of Second Level Bitmap free: 25 eeoa Block 45BC211A num er: Inc e Objd: 87427 pdba : axe 1 oooeb2 opcode Xid Ll Ranges axe 1 axe 1 oaeece axe 1 axe 1 aaeeee axe 1 aaeete axe 1000100 axelaaelle axelaae12e axe laae18e axelaae181 axe 1 axe 1002201 axe 1 aae28e axe 1000281 axe 1 aae3ee axe 1002301 axe 1002380 axe 1 aae381 axe 1 aae4ee axel aaeael axe 1 aae48e axel aae481 axel aae5ee axelaaeroel axel aae58e exe1aae581 Free Free Free Free Free Free Free • Free Free Free Free Free Free Free Free Free Free Free • Free • Free: Free • Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst : Inst :


查看178号块(L3)

alter system dump datafile 4 block 178 ;

 

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


记录了L2的地址,如果不足以存储L2,就会新建L3

Second Level Bitmap block DBAS DBA øxel oeeebl


type: 0x23=PAGETABLE SEGMENT HEADER看出是L1

Start dump data blocks tsn: 4 file#:4 minblk 178 maxblk 178 Block dump from cache: Dump of buffer cache at level 4 for tsn=4 rdba -16777394 BH (BX78bdbf28) file#: 4 rdba: exaleeoab2 (4/178) class: 4 ba: set : 5 pool: 3 bsz: 8192 bsi: d sflg: 1 pwc: 18,28 dbwrid: e obj: 87427 objn: 87427 tsn: 4 afn: 4 hint: f hash: tex86beagea, ex979ee44B) It-u: (OX78bdC4f8, ex78bdbee0] 001745BE eaan eeea eoeeeoc eaeeeeu el eee5Ec eeaeeeeo ax7889eeea ckptq: [NULL] fileq: [NULLI objq: (Ox78bdbfB8, ax78bdaf301 objaq: st: XCURRENT md: NULL fpin: 'ktswhB3: ktscts' tch: 7 flags: block_written_once redo_since_ read LR8A: [exe.a.e] LSCN: [exa.ø] HSCN: [exffff .ffffffffl HSU8: (21 Block dump from disk: buffer tsn: 4 rdba: exal eee0b2 (4/178) Scn: exaaee. 001745be seq frmt: exa2 chkval: Oxff9c type: ax23=PAGETABLE SEGMENT HEADER Hex dump of block: st—a, yp_ oun = Dump of memory from exeaee2B5344B18Aea to axeee028534431AAoe ( ax6ataø248, ex78bdbf18] .1 2B5344B18Aee 2B5344B18AIO 2B5344B18A20 2B5344B18A30 2B5344B18A40 2B5344B18A50 2B5344B18A60 2B5344B18A7e 2B5344B18A8e 2B5344B18Age oeeeA223 oeeeFF9c eeeeaeee eeeea018 eeeeaeee egeeaeee aeeeoo€c egeeae18 el eea581 eeeeaeee 01 eeeaB2 aeoeeaae aeeeean g aeeeean 8 aeeeeaae aeeeeau eeeeeaae eeeeeaae aeeeeaee eaeeeeae eaeeesae eaeeeeae eaeeøeae eoeeeæc eaeøøeae eaeøøeae eeaeeeea eeaeeA9c el aee5Ec eeoee4Ec eeaeBB18 el aeg581 eeaeeøeo øeaegøea


如果由于L2不够放了,生产了第二个L3

Segment Type: 1 n12: 237 blksz: 204B L2 Array start offset: ox00000434 fbsz: First Level 3 BMB: Ox037dB6de L2 Hint for inserts: ox04776686 Last Level 1 BMs: ox04779975 Last Level 11 BMB: ox047766B6 Last Level 111 BMS: Oi0472fcd7 Map Header: : next Ox034000bf Extent Map *extents: 51 obi # : 33141 flag: ox20000000

Start dump data blocks tsn: 12 file* : 13 minblk 4032222 maxblk 4032222 buffer tsn: 12 rdba: Ox037d86de (13/4032222) scn: OxOOOO. OOfce076 seq: Ox01 flg: Ox04 tail: Oxe0762201 frmt: ox02 chkval•. Ox67f4 type: Ox22=THIRD LEVEL BITMAP BLOCK Dump of Third Level Bitmap Block number: 484 L2 Ranges Ox037d86dd Ox037dd22d Ox037eff6d Ox03802edO next . Ox037e1d7d Ox037f4abd Ox03807a20 Ox0472fcd7 Ox037e68cd Ox037f960d ox0380c570 Ox037eb41d Ox037fe15d ox038110co


删除一些数据,再看block

0: Metadata 1 : Metadata 2 :Metadata 3: 75—1008 free 4: 75-1008 free 8: 75—1008 free 5: 75—1008 free 9: 75—1008 free 6: 75—1008 free 7: 75-1008 10: 75-1008 free 11:75-1008 free free 12:75-1008 15: 75-1008 data free blocks 13:75-1008 free tsn: 4 file#: 3 14: 75-1008 free minblk 9 maxblk 9 free End dump


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';


SEGMENT TEST TEST3 SEGMENT TABLE TABLE TYPE FREELISTS FREELIST GROUPS


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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69980685/viewspace-3004184/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、sql server、oceanbase数据库专家,拥有7年以上的大型数据库运维经验,主方向oracle,擅长故障排除、诊断,大体量(TB)迁移,异常故障修复等。拥有丰富主导大型项目经验。服务行业包括:运营商、银行、金融业、政府单位、医疗、制造业、高校等等。

注册时间:2020-07-31

  • 博文量
    116
  • 访问量
    88776