Oracle Freelist和HWM的性能优化

来源:pcdog 作者:佚名 2008-04-02 出处:pcdog.com

oracle  oracle数据库  存储过程  
上一页 1 2 3 4 5 6 7 8 下一页 

    在段中存在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时。

    2.4 Free list行为

    2.4.1 Freelist Link and Unlink 操作

    Freelist 按后进先出队列(LIFO) 方式管理。也就是说最后被link到freelist的块拥有最先unlink的机会。

    当块中空闲空间增加到大于PCTFREE时,块放入freelist中。free list中的块可用来作update 或insert。 当块中没有足够的空间用于insert操作时并且使用空间大于PCTUSED,块就会从free list中移出。

    在块在DELETE or UPDATE 操作之后,如果使用空间落到PCTUSED下,块再次link到free list中。每次块加入free list时,都是link到链表的头部。

    例如:考虑段中有120个块编号由1到120。其中有6个块在free list上并假设HWM是 80。(block实际使用DBA编号)

    10->24->45->46->65->80-|

    现在作INSERT 操作,需要400 bytes空间。假设块10上空间不足,但块24上空间可用。现在数据插入到块 24 ,现在块24的剩余空间小于该表的PCTUSED。因此块 24 从free list链表中移出。PCTFREE and PCTUSED参数的目的就是用来控制数据块从free list的链表中移入/移出行为的。现在free lists象这样:

    10->45->46->65->80-|

    然后在同一事务中作DELETE同一个段的数据,使块 54 和 67落到PCTUSED下。现在这些块加入到free list链中。free list链现在象这样:

    67->54->10->45->46->65->80-|

    2.4.2 Transaction Free List 算法

    扫描segment Header块中所有的Tx free list,检查是否还没有Tx free list entry分配给transaction, 如何没有,将寻找未使用的entry或已经提交了事务的空的Tx free list。如果上述搜索过程失败, 新的entry会在segment Header块中Tx free lists区域中开辟。如果没有空间来生成, 事务就必须等待entry的释放。

    segment header中的最大free list个数:

    Block Size Max # Freelists

    ----------- -----------------

    2K 24

    4K 50

    8K 101

    16k 204

    事务T1释放出来的空闲块(DELETE or UPDATE)的使用 :


更多内容请看PCdog.com--性能调优专题
上一页 1 2 3 4 5 6 7 8 下一页 
上一篇:SQL Server和Oracle的真正区别
下一篇:归纳一下ORACLE中的数据类型