技术开发 频道

Oracle Freelist和HWM原理及性能优化

    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时。

0
相关文章