Oracle Freelist和HWM原理探讨及相关性能优化
时间:2007-12-23 来源:不详 作者:迈克DB
nfl=3,nfb=1typ=1nxf=0
SEGLST::flg:UNUSEDlhd:0x00000000ltl:0x00000000
SEGLST::flg:USEDlhd:0x03c00233ltl:0x03c00233
SEGLST::flg:USEDlhd:0x03c00234ltl:0x03c00234
SEGLST::flg:UNUSEDlhd:0x00000000ltl:0x00000000
SegmentHeader:
==>nfl:numberoffreelists/block
==>nfb:numberoffreelistblocks segmentheader
==>typ:blocktype
==>nxf:numberoftransactionfreelists
SegmentList:
==>flg:flagUSEDorUNUSEDthefreelist
==>lhd:headoffreelist
==>ltl:tailoffreelist
在每一个块中都有一个标记flg用来表明块是否链入了freelist链中。假如这个标志置上,该块中后向指针指向freelist链中下一个块的DBA。假如当前块是链的最末尾的块,该后向指针值为0。
这里给出位于freelist上的blockdump的片段
Blockheaderdump:0x03c00235
ObjectidonBlock?Y
seg/obj:0xe2d8csc:0x00.6264c61itc:1flg:Otyp:1-DATA
fsl:1fnx:0x3c00234ver:0x01
==>Seg/objObjectIDindictionary
==>cscSCNoflastblockcleanout
==>itcNumberofITLslots
==>flgO=Onfreelist,-=Notonfreelist
织梦好,好织梦
==>typ1=DATA2=INDEX
==>fslITLTXfreelistslot
==>fnxDBAofNEXTblockonfreelist
举例来说假如有五个块在freelist中,分别为A,B,C,D,E
就会形成segmentheader->A->B->C->D->E--|
同时segmentheader->E
2.3freelist类别
在段中存在3类freelist,即MasterFreelists(MFL),ProcessFreelists(PrFL),和TransactionFreelists.
2.3.1MasterFreeList(公用空闲空间池):
每一个段中有一个Masterfreelist,在段创建的时候自动生成。对于每一个段来说都有这样一个空闲空间池,对每个进程都是公用的,空闲空间就是位于masterfreelist的块上。由于Masterfreelist是公用的,因此当多个进程同时插入行到同一个段上,masterfreelist竞争使用程度就会增加。
2.3.2ProcessFreeLists
为了减少MasterFreelist的竞争问题,引入了另一种freelist叫做Processfreelists,根据sql命令CREATE/ALTER中的参数FREELISTS创建.这样多个freelist就可以分摊空闲空间的治理,以提高OLTP应用作高度并发插入和更新事务时空间分配治理的性能。通过指定CREATETABLE/CLUSTERorINDEX的子句STORAGE的参数FREELISTS来创建,例如:CREATETABLEflg(....)...STORAGE(...FREELISTS10...)。缺省的FREELISTS为1,此时不会创建Processfreelists。当FREELISTS>=2时,创建Processfreelists。
内容来自dedecms
进程在使用processfreelist是根据进程的OraclePID(ProcessID)来选择的,公式如下:
selectlistentry=(PID%NFL) 1
NFL:FREELISTS定义的Processfreelist个数
2.3.3TransactionFreeLists
当Oracle需要时动态创建。一个TransactionFreeList是一种专门给某一个事务使用的freelist.每个段至少有16个transactionsfreelists,并且这个值在需要时会增长,直到达到SegmentHeader块的大小限制。一个事务只有下面情况下会需要分配一个TxFreeListsentry:块中释放空间时(DELETEorUPDATE)并且还不存在TxFreeListsentry时。
2.4Freelist行为
2.4.1FreelistLinkandUnlink操作
Freelist按后进先出队列(LIFO)方式治理。也就是说最后被link到freelist的块拥有最先unlink的机会。
当块中空闲空间增加到大于PCTFREE时,块放入freelist中。freelist中的块可用来作update或insert。当块中没有足够的空间用于insert操作时并且使用空间大于PCTUSED,块就会从freelist中移出。
在块在DELETEorUPDATE操作之后,假如使用空间落到PCTUSED下,块再次link到freelist中。每次块加入freelist时,都是link到链表的头部。
上一篇:字符集问题的初步探讨 下一篇:SQLServer数据库安全规划全攻略
文章评论
共有位Admini5网友发表了评论 查看完整内容