Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103754350
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-12 13:52:28

   来源:Oracle    作者:zhouwf0726

2.2 free list概念

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

l flag指示free list 被使用(1)或未使用(0)

l free list 链的首块的地址DBA(data block address)

l free list 链的尾块的地址DBA

free list 的信息通常保留在segment header中,这里给出segment header block dump片段加以说明:

nfl = 3, nfb = 1 typ = 1 nxf = 0 
    SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
    SEG LST:: flg: USED lhd: 0x03c00233 ltl: 0x03c00233 
    SEG LST:: flg: USED lhd: 0x03c00234 ltl: 0x03c00234 
    SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 

    Segment Header: 
    ==> nfl: number of free lists/block 
    ==> nfb: number of free list blocks + segment header 
    ==> typ: block type 
    ==> nxf: number of transaction free lists 
    Segment List: 
    ==> flg: flag USED or UNUSED the free list 
    ==> lhd: head of free list 
    ==> ltl: tail of free list

在每一个块中都有一个标记flg用来表明块是否链入了 free list链中。如果这个标志置上,该块中后向指针指向free list链中下一个块的DBA。如果当前块是链的最末尾的块,该后向指针值为0。这里给出位于free list上的block dump的片段

Block header dump: 0x03c00235 
    Object id on Block? Y 
    seg/obj: 0xe2d8 csc: 0x00.6264c61 itc: 1 flg: O typ: 1 - DATA 
    fsl: 1 fnx: 0x3c00234 ver: 0x01 

    ==> Seg/obj Object ID in dictionary 
    ==> csc SCN of last block cleanout 
    ==> itc Number of ITL slots 
    ==> flg O = On freelist , - = Not on freelist 
    ==> typ 1 = DATA 2 = INDEX 
    ==> fsl ITL TX freelist slot 
    ==> fnx DBA of NEXT block on freelist

举例来说如果有五个块在free list中,分别为A,B,C,D,E

就会形成segment header->A->B->C->D->E--|

同时segment header->E

2.3 free list类别

在段中存在3类free list, 即Master Freelists (MFL), Process Freelists (PrFL), 和 Transaction Freelists.

2.3.1 Master Free List(公用空闲空间池):

每一个段中有一个Master free list,在段创建的时候自动生成。对于每一个段来说都有这样一个空闲空间池,对每个进程都是公用的,空闲空间就是位于master free list 的块上。由于Master free list是公用的,因此当多个进程同时插入行到同一个段上,master free list竞争使用程度就会增加。

2.3.2 Process Free Lists

为了减少Master Free list的竞争问题, 引入了另一种free list叫做Process free lists, 根据sql命令 CREATE/ALTER 中的参数FREELISTS 创建. 这样多个free list 就可以分摊空闲空间的管理,以提高OLTP应用作高度并发插入和更新事务时空间分配管理的性能。通过指定CREATE TABLE / CLUSTER or INDEX的子句STORAGE的参数FREELISTS 来创建,例如: CREATE TABLE flg ( . . . .) . . . STORAGE ( ... FREELISTS 10 ...)。缺省的FREELISTS为1,此时不会创建Process free lists。当FREELISTS>=2时,创建Process free lists。

进程在使用process free list是根据进程的Oracle PID (Process ID)来选择的,公式如下:

  select list entry = (PID % NFL) + 1

NFL : FREELISTS定义的Process free list个数

2.3.3 Transaction Free Lists

当Oracle需要时动态创建。一个Transaction Free List 是一种专门给某一个事务使用的free list. 每个段至少有16个transactions free lists, 并且这个值在需要时会增长,直到达到Segment Header块的大小限制。一个事务只有下面情况下会需要分配一个Tx Free Lists entry: 块中释放空间时(DELETE or UPDATE) 并且还不存在Tx Free Lists entry时。

阅读(202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~