在Oracle 9i中,Oracle引入了自动段空间管理(ASSM)技术,在ASSM中,原有的freelist被位图所取代,通过位图能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善段存储管理的本质。
在ASSM管理下,insert通过扫描位图来查找可用的block,即使block的可用空间低于PCTFREE,也不会从位图中摘除,因此PCTUSED参数将不再需要;而PCTFREE参数,仍然需要它来指示需要保留多少空间给后续的update导致的行数据增长使用。至于freelists和freelist groups参数在ASSM中都无效了。
新的管理机制用位图数组来跟踪或管理每个分配到对象的块,而每个块有多少剩余空间是根据位图的状态来确定的,如>75%、50%~75%、25%~50%和<25%,也就是说位图其实采用了4个状态位来代替以前的PCTUSED,什么时候该利用该数据块则由设定的PCTFREE来确定。
使用ASSM的一个巨大优势是,位图数组肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle 9i以前的版本里曾经是一个严重的问题。在没有多个自由列表的时候,每个Oracle段通过在段头保留一个数据块用于自由列表(假定只有一个freelist),自由列表用来管理对象所使用的剩余区块,并为新数据行提供数据块。可以想象,当多个事务并发请求空间时,竞争将会出现。
有了ASSM之后,Oracle宣称显著地提高了DML并发操作的性能,因为位图数组的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据Oracle的测试结果,使用位图数组会显著地消除所有对段头的竞争,还能获得超快的并发插入性能。以下是ASSM表空间中一个数据文件的头部的结构。
删除前面创建的测试表空间:
SQL> drop tablespace eygle including contents and datafiles; Tablespace dropped.
重新创建一个ASSM管理的表空间:
SQL> CREATE TABLESPACE eygle 2 DATAFILE '/opt/oracle/oradata/eygle/eygle01.dbf' SIZE 10M 3 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128k 4 SEGMENT SPACE MANAGEMENT AUTO; Tablespace created. SQL> SELECT tablespace_name, extent_management, allocation_type,segment_space_management 2 FROM dba_tablespaces WHERE tablespace_name = 'EYGLE'; TABLESPACE_NAME EXTENT_MAN ALLOCATIO SEGMEN ------------------------------ ---------- --------- ------ EYGLE LOCAL UNIFORM AUTO
然后创建一个对象:
SQL> create table eygle.test as select * from dba_objects; Table created. SQL> col segment_name for a30 SQL> select segment_name,file_id,block_id,to_char(block_id,'xx') hex_block_id,blocks 2 from dba_extents where tablespace_name='EYGLE'; SEGMENT_NAME FILE_ID BLOCK_ID HEX BLOCKS ------------ ---------- ---------- --- ---------- TEST 3 9 9 16 TEST 3 25 19 16 TEST 3 41 29 16 TEST 3 57 39 16 TEST 3 73 49 16 TEST 3 89 59 16 6 rows selected.
通过图5-4来看一下ASSM的管理机制,首先前2个数据块为数据文件头,3~8个数据块为区位图块,接下来的第9个块和第10个块就是ASSM位图块。
一级位图块用于管理具体数据块的使用,来看一下第9个Block的内容:
SQL> alter system dump datafile 3 block 9; System altered.
转储文件内容为:
Start dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9 buffer tsn: 4 rdba: 0x00c00009 (3/9) scn: 0x0004.6c1e9ab0 seq: 0x03 flg: 0x00 tail: 0x9ab02003 frmt: 0x02 chkval: 0x0000 type: 0x20=FIRST LEVEL BITMAP BLOCK Dump of First Level Bitmap Block -------------------------------- nbits : 4 nranges: 1 parent dba: 0x00c0000a poffset: 0 unformatted: 0 total: 16 first useful block: 3 owning instance : 1 instance ownership changed at Last successful Search Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0 Extent Map Block Offset: 4294967295 First free datablock : 16 Bitmap block lock opcode 0 Locker xid: : 0x0000.000.00000000 Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0 #blocks in seg. hdr's freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0 HWM Flag: Not Set -------------------------------------------------------- DBA Ranges : -------------------------------------------------------- 0x00c00009 Length: 16 Offset: 0 0:Metadata 1:Metadata 2:Metadata 3:FULL 4:FULL 5:FULL 6:FULL 7:FULL 8:FULL 9:FULL 10:FULL 11:FULL 12:FULL 13:FULL 14:FULL 15:FULL -------------------------------------------------------- End dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9
注意到这个位图管理了16个Block,地址范围从0x00c00009开始(也就是第9个数据块),其中前3个Block(0~2)用于存储元数据,其余用来存储数据,FULL状态表示块已经用完。这就是第一级位图块(FIRST LEVEL BITMAP BLOCK)。
由于这个位图块只能管理16个Block,如果这个对象的空间超过这个值,那么Oracle就要分配更多的第一级位图块来管理Block,进而这些一级位图块又需要管理,于是又引出了二级位图块,Oracle最多支持三级位图块。
注意这个Block上还记录了另外一个信息“parent dba: 0x00c0000a”,这里也就是指二级位图块的地址,0a就是第10个Block,转储一下第10个Block的内容:
Start dump data blocks tsn: 4 file#: 3 minblk 10 maxblk 10 buffer tsn: 4 rdba: 0x00c0000a (3/10) scn: 0x0004.6c1e9ab0 seq: 0x06 flg: 0x00 tail: 0x9ab02106 frmt: 0x02 chkval: 0x0000 type: 0x21=SECOND LEVEL BITMAP BLOCK Dump of Second Level Bitmap Block number: 6 nfree: 1 ffree: 5 pdba: 0x00c0000b opcode:0 xid: L1 Ranges : -------------------------------------------------------- 0x00c00009 Free: 1 Inst: 1 0x00c00019 Free: 1 Inst: 1 0x00c00029 Free: 1 Inst: 1 0x00c00039 Free: 1 Inst: 1 0x00c00049 Free: 1 Inst: 1 0x00c00059 Free: 5 Inst: 1 -------------------------------------------------------- End dump data blocks tsn: 4 file#: 3 minblk 10 maxblk 10
注意这个二级位图块(SECOND LEVEL BITMAP BLOCK)正是记录了一级位图块的地址,L1 Ranges代表的就是这个内容,也正是每个区间的第一个Block,在这个块内同样包含了一个上级位图块地址,在这里是是pdba: 0x00c0000b,也就是块11。
为了方便rdba向文件号和数据块号的转换,可以创建如下函数:
SQL> CREATE OR REPLACE FUNCTION getbfno (p_dba IN VARCHAR2) 2 RETURN VARCHAR2 3 IS 4 l_str VARCHAR2 (255) DEFAULT NULL; 5 BEGIN 6 l_str := 7 'datafile# is:' 8 || DBMS_UTILITY.data_block_address_file (TO_NUMBER (LTRIM (p_dba, '0x'),'xxxxxxxx')) 9 || chr(10)||'datablock is:' 10 || DBMS_UTILITY.data_block_address_block (TO_NUMBER (LTRIM (p_dba, '0x'),'xxxxxxxx')); 11 RETURN l_str; 12 END; 13 / Function created.
现在转换0x00c0000b就更直观了:
SQL> col bfno for a30 SQL> select getbfno('0x00c0000b') bfno from dual; BFNO ------------------------------ datafile# is:3 datablock is:11
转储文件3块11信息,这个数据块正是数据段的段头信息,段头中记录了哪些位图块管理单元被包含在对象中:
Start dump data blocks tsn: 4 file#: 3 minblk 11 maxblk 11 buffer tsn: 4 rdba: 0x00c0000b (3/11) scn: 0x0004.6c1e9ab7 seq: 0x01 flg: 0x04 tail: 0x9ab72301 frmt: 0x02 chkval: 0x718b type: 0x23=PAGETABLE SEGMENT HEADER Extent Control Header ----------------------------------------------------------------- Extent Header:: spare1: 0 spare2: 0 #extents: 6 #blocks: 96 last map 0x00000000 #maps: 0 offset: 2716 Highwater:: 0x00c0005d ext#: 5 blk#: 4 ext size: 16 #blocks in seg. hdr's freelists: 0 #blocks below: 84 mapblk 0x00000000 offset: 5 Unlocked -------------------------------------------------------- Low HighWater Mark : Highwater:: 0x00c0005d ext#: 5 blk#: 4 ext size: 16 #blocks in seg. hdr's freelists: 0 #blocks below: 84 mapblk 0x00000000 offset: 5 Level 1 BMB for High HWM block: 0x00c00059 Level 1 BMB for Low HWM block: 0x00c00059 -------------------------------------------------------- Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 L2 Array start offset: 0x00001434 First Level 3 BMB: 0x00000000 L2 Hint for inserts: 0x00c0000a Last Level 1 BMB: 0x00c00059 Last Level II BMB: 0x00c0000a Last Level III BMB: 0x00000000 Map Header:: next 0x00000000 #extents: 6 obj#: 9972 flag: 0x20000000 Extent Map ----------------------------------------------------------------- 0x00c00009 length: 16 0x00c00019 length: 16 0x00c00029 length: 16 0x00c00039 length: 16 0x00c00049 length: 16 0x00c00059 length: 16 Auxillary Map -------------------------------------------------------- Extent 0 : L1 dba: 0x00c00009 Data dba: 0x00c0000c Extent 1 : L1 dba: 0x00c00019 Data dba: 0x00c0001a Extent 2 : L1 dba: 0x00c00029 Data dba: 0x00c0002a Extent 3 : L1 dba: 0x00c00039 Data dba: 0x00c0003a Extent 4 : L1 dba: 0x00c00049 Data dba: 0x00c0004a Extent 5 : L1 dba: 0x00c00059 Data dba: 0x00c0005a -------------------------------------------------------- Second Level Bitmap block DBAs -------------------------------------------------------- DBA 1: 0x00c0000a End dump data blocks tsn: 4 file#: 3 minblk 11 maxblk 11
注意段头的数据块类型是Oracle 9i中新增的“type: 0x23=PAGETABLE SEGMENT HEADER”,在段头的最后部分记录了二级位图块的地址:
Second Level Bitmap block DBAs -------------------------------------------------------- DBA 1: 0x00c0000a
所以通常SEGMENT HEADER也被看作是第一个Level 3级的位图块,如果SEGMENT HEADER的空间不足以存储二级位图块的指针,那么新的Level 3级位图块将被创建。
也可以DUMP一下第89个位图块:
SQL> alter system dump datafile 3 block 89; System altered.
其内容就包括了未使用(unformatted)的数据块,其二级位图块同样指向了0x00c0000a:
Start dump data blocks tsn: 4 file#: 3 minblk 89 maxblk 89 buffer tsn: 4 rdba: 0x00c00059 (3/89) scn: 0x0004.6c1e9ab0 seq: 0x02 flg: 0x04 tail: 0x9ab02002 frmt: 0x02 chkval: 0x5b35 type: 0x20=FIRST LEVEL BITMAP BLOCK Dump of First Level Bitmap Block -------------------------------- nbits : 4 nranges: 1 parent dba: 0x00c0000a poffset: 5 unformatted: 12 total: 16 first useful block: 1 owning instance : 1 instance ownership changed at Last successful Search Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0 Extent Map Block Offset: 4294967295 First free datablock : 4 Bitmap block lock opcode 0 Locker xid: : 0x0000.000.00000000 Highwater:: 0x00c0005d ext#: 5 blk#: 4 ext size: 16 #blocks in seg. hdr's freelists: 0 #blocks below: 84 mapblk 0x00000000 offset: 5 HWM Flag: HWM Set -------------------------------------------------------- DBA Ranges : -------------------------------------------------------- 0x00c00059 Length: 16 Offset: 0 0:Metadata 1:FULL 2:FULL 3:FULL 4:unformatted 5:unformatted 6:unformatted 7:unformatted 8:unformatted 9:unformatted 10:unformatted 11:unformatted 12:unformatted 13:unformatted 14:unformatted 15:unformatted -------------------------------------------------------- End dump data blocks tsn: 4 file#: 3 minblk 89 maxblk 89
如果删除部分数据,就可以看到空间记录的变化:
SQL> delete from eygle.test where owner='SYS'; 4030 rows deleted. SQL> commit; Commit complete. SQL> select count(*) from eygle.test; COUNT(*) ---------- 2143
再看块9的内容:
Start dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9 buffer tsn: 4 rdba: 0x00c00009 (3/9) scn: 0x0004.6c1ea433 seq: 0x03 flg: 0x04 tail: 0xa4332003 frmt: 0x02 chkval: 0x0abd type: 0x20=FIRST LEVEL BITMAP BLOCK Dump of First Level Bitmap Block -------------------------------- nbits : 4 nranges: 1 parent dba: 0x00c0000a poffset: 0 unformatted: 0 total: 16 first useful block: 3 owning instance : 1 instance ownership changed at Last successful Search Freeness Status: nf1 0 nf2 0 nf3 0 nf4 13 Extent Map Block Offset: 4294967295 First free datablock : 3 Bitmap block lock opcode 0 Locker xid: : 0x0000.000.00000000 Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0 #blocks in seg. hdr's freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0 HWM Flag: Not Set -------------------------------------------------------- DBA Ranges : -------------------------------------------------------- 0x00c00009 Length: 16 Offset: 0 0:Metadata 1:Metadata 2:Metadata 3:75-100% free 4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free 8:75-100% free 9:75-100% free 10:75-100% free 11:75-100% free 12:75-100% free 13:75-100% free 14:75-100% free 15:75-100% free -------------------------------------------------------- End dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9
注意:在实际的情况中,每个一级位图块并非特定管理16个块的空间信息,当创建一个Uniform Size为5MB的表空间,其位图块要管理64个Block。
SQL> create tablespace test datafile '/opt/oracle/test.dbf' size 20M 2 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 5M 3 SEGMENT SPACE MANAGEMENT AUTO 4 / Tablespace created.
创建测试对象:
SQL> create table eyobj tablespace test as select * from dba_objects; Table created. < …Insert lots of rows …> SQL> col segment_name for a20 SQL> SELECT segment_name, file_id, block_id, blocks 2 FROM dba_extents 3 WHERE tablespace_name = 'TEST'; SEGMENT_NAME FILE_ID BLOCK_ID BLOCKS -------------------- ---------- ---------- ---------- EYOBJ 4 9 640 EYOBJ 4 649 640 SQL> alter system dump datafile 4 block min 9 block max 11; System altered.
简要转储信息:
…… scn: 0x0004.6c1ea061 seq: 0x03 flg: 0x04 tail: 0xa0612003 frmt: 0x02 chkval: 0x4b61 type: 0x20=FIRST LEVEL BITMAP BLOCK Dump of First Level Bitmap Block -------------------------------- nbits : 4 nranges: 1 parent dba: 0x01000013 poffset: 0 unformatted: 0 total: 64 first useful block: 12 ……. -------------------------------------------------------- DBA Ranges : -------------------------------------------------------- 0x01000009 Length: 64 Offset: 0 0:Metadata 1:Metadata 2:Metadata 3:Metadata 4:Metadata 5:Metadata 6:Metadata 7:Metadata 8:Metadata 9:Metadata 10:Metadata 11:Metadata 12:FULL 13:FULL 14:FULL 15:FULL 16:FULL 17:FULL 18:FULL 19:FULL 20:FULL 21:FULL 22:FULL 23:FULL 24:FULL 25:FULL 26:FULL 27:FULL 28:FULL 29:FULL 30:FULL 31:FULL 32:FULL 33:FULL 34:FULL 35:FULL 36:FULL 37:FULL 38:FULL 39:FULL 40:FULL 41:FULL 42:FULL 43:FULL 44:FULL 45:FULL 46:FULL 47:FULL 48:FULL 49:FULL 50:FULL 51:FULL 52:FULL 53:FULL 54:FULL 55:FULL 56:FULL 57:FULL 58:FULL 59:FULL 60:FULL 61:FULL 62:FULL 63:FULL --------------------------------------------------------
总结一下,ASSM的三级位图块的结构如图5-5所示:
图5-5 ASSM三级位图块示意图
通常Segment Header同时被认为是第一个三级位图块,这个位图块包含一系列指向二级位图块的指针,当这个数据块的空间不足以存储2级位图块的地址时,第一个真正独立的三级位图块将会产生。由于Segment Header已经可以胜任极大数据量的对象的空间管理,所以通常很难观察到其他三级位图块的出现。曾经有朋友创建了900G左右的数据表,仍然没有新的三级位图块出现。
为了验证以上结构猜想,进行以下测试实验,实验要能够实现:
(1)更快速的区间分配与扩展;
(2)使segment header尽量小,以便进一步扩展。
为此可以创建一个2kB block_size的表空间,设置uniform size区间大小为10kB,这样可以尽量缩减空间耗用:
SQL> create tablespace eygle 2 datafile 'd:\EYGLE01.DBF' size 1024M reuse blocksize 2048 3 extent management local uniform size 10k 4 segment space management auto; 表空间已创建。 SQL> set timing on SQL> alter tablespace eygle add datafile 'f:\eygle02.dbf' size 8191M reuse; 表空间已更改。 已用时间: 00: 44: 42.08
创建一个数据表,设置高pctfree值,使得每个Block只存储一行数据,然后插入1千万记录:
SQL> create table EYGLE 2 ( 3 ID NUMBER(8), 4 UNAME CHAR(1000) 5 ) 6 tablespace eygle 7 pctfree 50 8 initrans 1 9 maxtrans 255 10 ; 表已创建。 SQL> begin 2 for i in 1 .. 100 loop 3 for i in 1 .. 100000 loop 4 insert into eygle values(i,'eygle'); 5 end loop; 6 commit; 7 end loop; 8 end; 9 /
这个表占用了大约9GB空间,用完了表空间的所有空间:
SQL> select bytes/1024/1024/1024 sizegb from dba_segments 2 where segment_name='EYGLE'; SIZEGB ---------- 8.9988327
此时第一个3级位图块出现了。首先来看一下Segment Header,也就是PAGETABLE SEGMENT HEADER的信息,寻找Segment Header可以查询dba_segments视图:
SQL> select segment_name,header_file,header_block from dba_segments 2 where segment_name='EYGLE'; SEGMENT_NAME HEADER_FILE HEADER_BLOCK -------------------- ----------- ------------ EYGLE 12 35
转储数据文件12数据块35得到以下信息:
Start dump data blocks tsn: 12 file#: 12 minblk 35 maxblk 35 buffer tsn: 12 rdba: 0x03000023 (12/35) scn: 0x0000.00bdd4ab seq: 0x04 flg: 0x04 tail: 0xd4ab2304 frmt: 0x02 chkval: 0xaece type: 0x23=PAGETABLE SEGMENT HEADER Extent Control Header …………. -------------------------------------------------------- Segment Type: 1 nl2: 237 blksz: 2048 fbsz: 0 L2 Array start offset: 0x00000434 First Level 3 BMB: 0x037d86de L2 Hint for inserts: 0x037fe15d Last Level 1 BMB: 0x037ffdcc Last Level II BMB: 0x037fe15d Last Level III BMB: 0x037d86de Map Header:: next 0x034000bf #extents: 51 obj#: 33141 flag: 0x20000000 Extent Map -----------------------------------------------------------------
注意这里的First Level 3 BMB和Last Level III BMB已经出现,同时指向了另外一个数据块0x037d86de,这个地址转换出来就是datafile 13 block 4032222:
SQL> select getbfno('0x037d86de') bfno from dual; BFNO ------------------------------ datafile# is:13 datablock is:4032222
转储这个三级位图块的信息如下:
Start dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222 buffer tsn: 12 rdba: 0x037d86de (13/4032222) scn: 0x0000.00bdc864 seq: 0x01 flg: 0x04 tail: 0xc8642201 frmt: 0x02 chkval: 0xf597 type: 0x22=THIRD LEVEL BITMAP BLOCK Dump of Third Level Bitmap Block number: 9 , next : 0x00000000 L2 Ranges : -------------------------------------------------------- 0x037d86dd 0x037dd22d 0x037e1d7d 0x037e68cd 0x037eb41d 0x037eff6d 0x037f4abd 0x037f960d 0x037fe15d -------------------------------------------------------- End dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222
以上就是一个难得一见的三级位图块,这个位图块记录了一系列的L2级位图块地址,同时记录下一个三级位图块的指针(next)。为了取得这个三级位图块,在Segment Header上已经记录了237个二级指针:
Second Level Bitmap block DBAs -------------------------------------------------------- DBA 1: 0x03000022 DBA 2: 0x03001963 DBA 3: 0x030035a1 DBA 4: 0x030057cf DBA 5: 0x03007d77 ...... DBA 236: 0x037cf03d DBA 237: 0x037d3b8d
进一步的插入数据,直至下一个三级位图块生成,此时Segment Header记录的信息如下:
-------------------------------------------------------- Segment Type: 1 nl2: 237 blksz: 2048 fbsz: 0 L2 Array start offset: 0x00000434 First Level 3 BMB: 0x037d86de L2 Hint for inserts: 0x04776686 Last Level 1 BMB: 0x04779975 Last Level II BMB: 0x04776686 Last Level III BMB: 0x0472fcd7 Map Header:: next 0x034000bf #extents: 51 obj#: 33141 flag: 0x20000000 Extent Map -----------------------------------------------------------------
这里记录的First Level 3 BMB仍然指向地址0x037d86de,而Last Level III BMB指向了新的三级位图块0x0472fcd7。再次转储此时的First Level 3 BMB 0x037d86de:
Start dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222 buffer tsn: 12 rdba: 0x037d86de (13/4032222) scn: 0x0000.00fce076 seq: 0x01 flg: 0x04 tail: 0xe0762201 frmt: 0x02 chkval: 0x67f4 type: 0x22=THIRD LEVEL BITMAP BLOCK Dump of Third Level Bitmap Block number: 484 , next : 0x0472fcd7 L2 Ranges : -------------------------------------------------------- 0x037d86dd 0x037dd22d 0x037e1d7d 0x037e68cd 0x037eb41d 0x037eff6d 0x037f4abd 0x037f960d 0x037fe15d 0x03802ed0 0x03807a20 0x0380c570 0x038110c0 ………………….
注意这里的Next指针已经指向了下一个三级位图块0x0472fcd7,
SQL> select getbfno('0x0472fcd7') bfno from dual; BFNO ------------------------------ datafile# is:17 datablock is:3341527
最后记录一下这个新的三级位图块:
Start dump data blocks tsn: 12 file#: 17 minblk 3341527 maxblk 3341527 buffer tsn: 12 rdba: 0x0472fcd7 (17/3341527) scn: 0x0000.00ff805c seq: 0x01 flg: 0x00 tail: 0x805c2201 frmt: 0x02 chkval: 0x0000 type: 0x22=THIRD LEVEL BITMAP BLOCK Dump of Third Level Bitmap Block number: 22 , next : 0x00000000 L2 Ranges : -------------------------------------------------------- 0x0472fcd6 0x04734826 0x04739376 0x0473dec6 0x04742a16 0x04747566 0x0474c0b6 0x04750c06 0x04755756 0x0475a2a6 0x0475edf6 0x04763946 0x04768496 0x0476cfe6 0x04771b36 0x04776686 0x0477b1d6 0x0477fd26 0x04784876 0x047893c6 0x0478df16 0x04792a66 -------------------------------------------------------- End dump data blocks tsn: 12 file#: 17 minblk 3341527 maxblk 3341527
根据以上的实验数据可以知道:ASSM的三级位图块之间以单向指针相连,Segment Header是一个例外,同时记录First和Last三级位图块的地址,使得三级位图块的链接形成了一个链接环,从而实现了三级位图块之间的导航。
尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作,但是Oracle 9iR2的位图分段管理还是有一些局限性的,这些局限主要包括:
· 一旦ASSM表空间被创建,DBA将无法控制表空间内部的数据表和索引的存储行为;
· ASSM不能用于创建临时的表空间,这是由排序时临时段的短暂特性决定的;
· 只有本地管理的表空间才能够使用ASSM管理技术(鉴于LMT已经成功地取代了DMT,这实际上已经算不上限制);
· 在高并发DML(例如INSERT、UPDATE和DELETE等)操作环境中,ASSM可能会出现性能上的问题。
正因为ASSM还不是太稳定与完善,所以至少在9iR2的版本上,还不建议生产系统中大规模使用ASSM的表空间。注意在Oracle 9i中,主要的缺省表空间都没有使用ASSM技术:
SQL> select * from v$version where rownum <2; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production SQL> select tablespace_name,extent_management,segment_space_management 2 from dba_tablespaces; TABLESPACE_NAME EXTENT_MAN SEGMEN ------------------------------ ---------- ------ SYSTEM LOCAL MANUAL UNDOTBS1 LOCAL MANUAL TEMP LOCAL MANUAL USERS LOCAL MANUAL
当创建表空间时,Oracle缺省地使用手工段管理方式:
SQL> create tablespace eygle ; Tablespace created. SQL> select tablespace_name,extent_management,segment_space_management 2 from dba_tablespaces where tablespace_name='EYGLE'; TABLESPACE_NAME EXTENT_MAN SEGMEN ------------------------------ ---------- ------ EYGLE LOCAL MANUAL
而在Oracle 10g/11g中,Oracle已经将ASSM技术逐渐应用到缺省表空间中:
SQL> select * from v$version where rownum <2; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi SQL> select tablespace_name,extent_management,segment_space_management 2 from dba_tablespaces; TABLESPACE_NAME EXTENT_MAN SEGMEN ------------------------------ ---------- ------ SYSTEM LOCAL MANUAL UNDOTBS1 LOCAL MANUAL SYSAUX LOCAL AUTO TEMP LOCAL MANUAL USERS LOCAL AUTO SQL> select * from v$version where rownum <2; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production SQL> select tablespace_name, extent_management, segment_space_management from dba_tablespaces; TABLESPACE_NAME EXTENT_MANAGEMENT SEGMENT_SPACE_MANAGEMENT ------------------------------ ----------------- ------------------------ SYSTEM LOCAL MANUAL UNDOTBS1 LOCAL MANUAL SYSAUX LOCAL AUTO TEMP LOCAL MANUAL USERS LOCAL AUTO
并且Oracle 10g/11g已经将ASSM作为默认的表空间管理模式:
SQL> create tablespace eygle; Tablespace created. SQL> SELECT tablespace_name, extent_management, allocation_type, 2 segment_space_management 3 FROM dba_tablespaces 4 WHERE tablespace_name = 'EYGLE'; TABLESPACE_NAME EXTENT_MAN ALLOCATIO SEGMEN ------------------------------ ---------- --------- ------ EYGLE LOCAL SYSTEM AUTO
这说明ASSM技术已经逐渐成熟,并且开始值得信赖。
要了解一项技术的另外一个侧面是参考Oracle的Bug列表,在Oracle 10g 10.2.0.3的补丁修正列表里,可以看到与ASSM有关的Bug修正,如表5-1所示。
表5-1 与ASSM有关的Bug修正及其说明
如下是Oracle 11g 11.2.0.2中修正的关于ASSM的bug列表( ASSM Space Management - Bitmap Managed Segments 部分):
表5-2:11.2.0.2中修正的ASM Bug列表
当然,这些Bug大多数情况下都不会遇到,关注一下这些信息可以让我们从更多侧面了解Oracle技术。