日期:2014-05-16  浏览次数:20502 次

SSM自动段空间管理 简介

因为ASSM的官方文档很少,经过多次的查证之后,终于弄明白了ASSM管理(BMB段管理)的内部机理,现在发表给大家共享.

因为资料有限,如果有错误,请大家指正?
为了进一步让大家明白ASSM,先说明ASSM的基本情况!?
-----------------------------------------------------------------------------------------------------?
在920以前,表的剩余空间的管理与分配都是由链接列表freelist来完成的,因为freelist存在串行的问题因此容易引起往往容易引起段头的争用与空间的浪费(其实这一点并不明显),最主要的还是因为需要DBA 花费大量的精力去管理这些争用并监控表的空间利用。?
自动段空间管理(ASSM),它首次出现在Oracle920里。有了ASSM,链接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed Segments(BMB 段)。
让我们看看位图freelist是如何实现的。我会从使用区段空间管理自动参数创建tablespace开始:?
create tablespace demo?
datafile '/ora01/oem/demo01.dbf '?
size 5m?
EXTENT MANAGEMENT LOCAL ? ? ? ? ???-- Turn on LMT (本地管理表空间)

SEGMENT SPACE MANAGEMENT AUTO ? ? ??-- Turn on ASSM;?

?

一旦你定义好了tablespace,那么表和索引就能够使用各种方法很容易地被移动到新的tablespace里,带有ASSM的本地管理tablespace会略掉任何为PCTUSED、NEXT和FREELISTS所指定的值。

?

当表格或者索引被分配到这个tablespace以后,用于独立对象的PCTUSED的值会被忽略(在自动段空间管理中,没有prtused参数),而Oracle9i会使用位图数组来自动地管理tablespace里表格和索引的freelist。对于在LMT(本地管理表空间)的tablespace内部创建的表格和索引而言,这个NEXT扩展子句是过时的,因为由本地管理的tablespace会管理它们。但是,INITIAL参数仍然是需要的,因为Oracle不可能提前知道初始表格加载的大小。对于ASSM而言,INITIAL最小的值是三个块。?

?

新的管理机制用位图来跟踪或管理每个分配到对象的块,每个块有多少剩余空间根据位图的状态来确定,如>75%,50%-75%,25%-50%和<25%,也就是说位图其实采用了四个状态位来代替以前的pctused(注意是数据块的一个参数,不是段的),什么时候该利用该数据块则由设定的pctfree来确定。?

?

使用ASSM的一个巨大优势是,位图freelist肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle9i以前的版本里曾是一个严重的问题?