在以前表的剩余空间的管理与分配都是由链接列表freelist来完成的因为freelist存在串行的问题因此容易引起往往容易引起段头的争用与空间的浪费(其实这一点并不明显)最主要的还是因为需要DBA 花费大量的精力去管理这些争用并监控表的空间利用 自动段空间管理(ASSM)它首次出现在Oracle里有了ASSM链接列表freelist被位图所取代它是一个二进制的数组能够迅速有效地管理存储扩展和剩余区块(free block)因此能够改善分段存储本质ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed Segments(BMB 段) 让我们看看位图freelist是如何实现的我会从使用区段空间管理自动参数创建tablespace开始 create tablespace demo datafile /ora/oem/demodbf size m EXTENT MANAGEMENT LOCAL Turn on LMT SEGMENT SPACE MANAGEMENT AUTO Turn on ASSM; 一旦你定义好了tablespace那么表和索引就能够使用各种方法很容易地被移动到新的tablespace里带有ASSM的本地管理tablespace会略掉任何为PCTUSEDNEXT和FREELISTS所指定的值 当表格或者索引被分配到这个tablespace以后用于独立对象的PCTUSED的值会被忽略而Oraclei会使用位图数组来自动地管理tablespace里表格和索引的freelist对于在LMT的tablespace内部创建的表格和索引而言这个NEXT扩展子句是过时的因为由本地管理的tablespace会管理它们但是INITIAL参数仍然是需要的因为Oracle不可能提前知道初始表格加载的大小对于ASSM而言INITIAL最小的值是三个块 新的管理机制用位图来跟蹤或管理每个分配到对象的块每个块有多少剩余空间根据位图的状态来确定如>%%%%%和<%也就是说位图其实采用了四个状态位来代替以前的pctused什么时候该利用该数据块则由设定的pctfree来确定 使用ASSM的一个巨大优势是位图freelist肯定能够减轻缓沖区忙等待(buffer busy wait)的负担这个问题在Oraclei以前的版本里曾是一个严重的问题 在没有多个freelist的时候每个Oracle表格和索引在表格的头部都曾有一个数据块用来管理对象所使用的剩余区块并为任何SQL插入声明所创建的新数据行提供数据块当数据缓沖内的数据块由于被另一个DML事务处理锁定而无法使用的时候缓沖区忙等待就会发生当你需要将多个任务插入到同一个表格里的时候这些任务就被强制等待而同时Oracle会在同时分派剩余的区块一次一个 有了ASSM之后Oracle宣称显着地提高了DML并发操作的性能因为(同一个)位图的不同部分可以被同时使用这样就消除了寻找剩余空间的串行化根据Oracle的测试结果使用位图freelist会消除所有分段头部(对资源)的争夺还能获得超快的并发插入操作 尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作但是Oraclei的位图分段管理还是有一些局限性的 · 一旦DBA被分配之后它就无法控制tablespace内部的独立表格和索引的存储行为 · 大型对象不能够使用ASSM而且必须为包含有LOB数据类型的表格创建分离的tablespace · 你不能够使用ASSM创建临时的tablespace这是由排序时临时分段的短暂特性所决定的 · 只有本地管理的tablespace才能够使用位图分段管理 · 使用超高容量的DML(例如INSERTUPDATE和DELETE等)的时候可能会出现性能上的问题 我们先创建一个本地管理的表空间采用段自动管理方式 create tablespace demo datafile /ora/oem/demodbf size m EXTENT MANAGEMENT LOCAL一定是本地管理 SEGMENT SPACE MANAGEMENT AUTO;ASSM管理的标志 创建同样一个表 SQL> create table demotab ( x number ) tablespace demo storage (initial K); Table created 我们指定初试区间大小是K SQL> select ttable_nametinitial_extenttnext_extenttpct_freetpct_used from user_tables t where ttable_name = DEMOTAB; TABLE_NAME INITIAL_EXTENT NEXT_EXTENT PCT_FREE PCT_USED DEMOTAB 可以看到NEXT_EXTENT与PCT_USED都为空 执行该过程检查表的初始状态 SQL> exec show_space(demotab); Total Blocks Total Bytes Unused Blocks Unused Bytes Last Used Ext FileId Last Used Ext BlockId Last Used Block 从这里我们能看到一些该表的特性其中最引人注意的就是表头了占用了三个块的大小() 另外一个注意的地方就是该表从第个块开始但是实际上这里是错误的应当是从第个块开始文件头占用了K的空间等于个块 我们从dba_extent中也能看到这样的信息实际上是从第个块开始的 SQL> select tsegment_nametextent_idtblock_id from dba_extents t where tsegment_name = DEMOTAB; SEGMENT_NAME EXTENT_ID BLOCK_ID DEMOTAB DEMOTAB …… 从这里可以看到第一个区间的开始块是 我直接开始分析第个块(段头) SQL> alter system dump datafile block ; System altered SQL> alter system dump datafile block ; System altered SQL> alter system dump datafile block ; System altered Start dump data blocks tsn: file#: minblk maxblk buffer tsn: rdba: x (/) scn: xac seq: x flg: x tail: xac frmt: x chkval: xa type: x=FIRST LEVEL BITMAP BLOCK Dump of First Level Bitmap Block
nbits : nranges: parent dba: xa poffset: unformatted: total: first useful block: owning instance : instance ownership changed at Last successful Search Freeness Status: nf nf nf nf Extent Map Block Offset: First free datablock : Bitmap block lock opcode Locker xid: : x Highwater:: xc ext#: blk#: ext size: #blocks in seg hdrs freelists: #blocks below: mapblk x offset: HWM Flag: HWM Set
DBA Ranges :
x Length: Offset: x Length: Offset: :Metadata :Metadata :Metadata :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted :unformatted
End dump data blocks tsn: file#: minblk maxblk Start dump data blocks tsn: file#: minblk maxblk buffer tsn: rdba: xa (/) scn: xa seq: x flg: x tail: xa frmt: x chkval: x type: x=SECOND LEVEL BITMAP BLOCK Dump of Second Level Bitmap Block number: nfree: ffree: pdba: xb opcode: xid: L Ranges :
x Free: Inst: x Free: Inst: x Free: Inst: x Free: Inst: x Free: Inst: x Free: Inst: x Free: Inst: x Free: Inst:
End dump data blocks tsn: file#: minblk maxblk Start dump data blocks tsn: file#: minblk maxblk buffer tsn: rdba: xb (/) scn: xad seq: x flg: x tail: xad frmt: x chkval: x type: x=PAGETABLE SEGME |