您的位置:首页 > 其它

dmt,lmt,mssm,assm

2014-08-04 16:03 344 查看
转载自http://blog.itpub.net/35489/viewspace-617263 

1.  DMT在Oracle8i或之前是默认的,LMT 在Oracle9i或之后的版本是默认的。备注: --LMT,DMT是针对一个tablespace中extents的管理

在Oracle 8i之前,包括8i,一直用的是DMT(Dictionary ManagementTablespace)字典管理表空间,它工作的原理是向uet$(代表used-extent table)、fet$(代表free-extent table)表插入、删除数据。当一个事务需要进行大量的扩展extent操作的时候,会向uet$表插入大量的数据,同时从fet$表中删除相关纪录的信息;当某个表的高水线下降,进行extent的回缩操作的时候,从uet$表删除大量的纪录,并且插入到fet$表中。空间管理引起对uet$,fet$的操作在大量extent的情况下严重影响性能所以这种管理表空间的方式是比较耗费资源的,尤其是发生大量extent
操作的时候,对uet$、fet$表的DML操作会引发性能问题。

从Oracle 8i开始,就引入了本地管理表空间(LMT)的概念,这里对扩展段(extent)的管理不是放到字典表中,而是用一个Bitmap纪录并进行操作,由于是对文件进行操作,所以速度比较快,而且在Bitmap上,可以同时并发多个事务,所以速度快了。

LMT:  在每个表空间的数据文件的头部加入了一个位图区(Bitmap),在其中记录每个区(extent)的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新数据文件头部(datafile header: 64K)的这个记录,反映这个变化。本地管理减少了数据字典的竞争 。

eg:  EXTENT MANAGEMENT LOCAL UNIFORM. SIZE  100M 

 

 

 

 

 

2.  ASSM & MSSM  .     备注: --ASSM,MSSM 是针对同一个segment中的所有的extents的blocks的管理

---------  MSSM (manual segment space managment) 

SEGMENT SPACE MANAGEMENT MANUAL :    表空间中的各个Objects 将会使用freelist和freelist group来管理segment中的free block,freelists存储在每个segment的header block中(segment的initial extent中的第一个block会被格式化为segment header). 一个段一般包含一个FREELIST. 

 

Freelist : 用于管理未分配的数据块,ASSM中不再使用。

Oracle在进行空间分配、回收和管理时是以区(extent: 由一系列的连续block组成) 为基本单位的,段(segment)由多个区(extent)组成,这些区可以是连续的也可以是不连续的,一般情况下一个对象(比如table,index)拥有一个段 (备注:分区表每个分区有一个段)。表空间中容纳段(segment)和区(extent) .  在生成段(segment)的时候,会同时分配初始区(initial extents), 初始区的第一个块就格式化为segment header,并被用来记录free
list描述信息、extents信息,HWM信息等。

free list是一种单向链表用于定位可以接收数据的块,在字典管理方式的表空间中,Oracle使用free list来管理未分配的存储块。Oracle记录了有空闲空间的块用于insert或Update。空闲空间来源于两种方式:1. 段中所有超过HWM的块,这些块已经分配给段了,但是还未被使用 。 2.  段中所有在HWM下的且链入了free list的块,可以被重用 . 

PCTUSED代表每个数据块必须用多少, PCTFREE代表每个数据库需要保留多少的空间,供以后块上数据行的扩展,一般一个段上面包含一个FREELIST,当事务需要获取空闲块时,就扫描freelist,如果扫描块数超过5块或到达freelist尽头,则抬高HWM(高水位线),让freelist容纳新的空闲块,以供使用,如果不能抬高HWM,表示段上面盘区已经用尽,则要中段所在的表空间分配新的盘区,如果表空间文件已经没有空间可分配,则扩展文件大小,如果磁盘空间太小无法扩展,则会返回ORA错误,当块上的空闲空间小于PCTFREE时,块会从freelist上去除,表示块不再空间,已经无法插入数据,当快上数据的容量被删除到PCTUSED以下时,又会回到FREELIST,默认情况下FREELIST位于段头块,当有多个针对段的并发操作时,就会引起段头的热块竞争,这个可以从v$session_wait的buffer
busy waiting事件看出,另外v$waitstat也会在总体上反映相关信息,相关的解决方法有分区表,为段添加多个freelist,或使用ASSM 。

 

---------ASSM (Automatic Segment Space Management ) 

在Oracle9.2.0中引入了ASSM自动表空间管理, 并取消为独立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存储参数的能力。

ASSM 更主要是为了解决并发的性能问题,用bitmap来取代freelist,使得segment header的竞争得到缓解,降低 buffer busy wait等等待事件

ASSM 仅仅在LMT (本地空间管理) 中有效。ASSM 在Oracle10g R1 或之前在设置表空间时都不是默认的, 之前的默认都是 MSSM . Oracle10g R2或之后才默认为ASSM , 所以10G R2之前版本建立Tablespace 需要特别指定 SEGMENT SPACE MANAGEMENT AUTO,否则默认为Manual 。 

SEGMENT SPACE MANAGEMENT AUTO :    表空间中的各个segment的free block的管理将由原来的链接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,assm表空间上创建的段还有另外一个称呼叫bitmap managed segments(bmb 段)。 新的管理机制用位图来跟踪或管理每个分配到对象的块,每个块有多少剩余空间根据位图的状态 来确定,如>75%,50%-75%,25%-50%和<25%,也就是说位图其实采用了四个状态位来代替以前的pctused,什么时候该利用该数据块则由设定的pctfree来确定。 

ASSM的优势:

在每个table或index头部block只有一个freelist的情况下,在freelist中寻找free block时采用的是串行化,即如果多个事务同时要insert一个table,当数据缓冲内的数据块被其中一个dml事务处理锁定而无法使用的时候(寻找free block),缓冲区忙等待就会发生, 直到第一个事务找到可用的block才释放,然后是下一个。 而采用ASSM的情况下,同一个位图的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据oracle的测试结果,使用位图freelist会消除所有分段头部(对资源)的争夺,还能获得超快的并发插入操作。

表空间中支持自动段空间管理 (ASSM), 就可以使用这个特性缩小段(segment),即降低HWM 。

ASSM 限制: 

自动段空间管理(ASSM)的限制:不能在包含LOB类型数据的表空间中使用

eg:  SEGMENT SPACE MANAGEMENT AUTO 

 

 

 

 

3. 是否可以更改Manual 到 Auto

不能直接将manual segment space management 转化为 ASSM,如果需要转化,我们需要创建一个新的assm的表空间,然后

move所有的 Objects 到这个表空间,除非我们确认一定需要ASSM, 不建议这样做,有太多的工作需要做。

you cannot "convert" from manual segment space management to ASSM (automatic segment space management) ; 

you would have to CREATE NEW tablespaces, move everything there. Unless you have identified a need for 

that, Not recommend doing it, lots of work.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: