[Freelists Internal] 关于Freelists和Freelist Groups的研究(1) 1。如果表空间不指定SEGMENT_SPACE_MANAGEMENT AUTO,仍然会使用Freelists和Freelist Groups来管理Free Block。2。默认的Freelists和Freelist Groups均为1。Dump Segment Header Block可以发现有一个Freelists,称为mater free list,每个segment至少有一个master free list。如:SEG LST:: flg: USED lhd: 0x01c0000b ltl: 0x01c0000bflg(flag)表示该freelist是否被使用lhd(list header)表示位于该list中的第一个可用block的dbaltl(list tail)表示位于该list中的最后一个可用block的dba,这个block必定位于HWM之下。每个位于list中的block header中存在一个指针指向下一个可用的block,如:fnx: 0x1c0008b3。如果创建segment时候指定多个freelists,比如设置freelists 2,那么在segment header block中总共有3个free list,其中1个是main free list,另外2个是process free list。如:SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 SEG LST:: flg: USED lhd: 0x01c0008b ltl: 0x01c0008b 4。只有当DML语句使block降到pctused参数指定值之下时,才会动态生成transaction free list记录这些block的dba。而一个新分配的block则始终是位于process free list或者main free list中的。每一个transaction都会动态创建自己的transaction free list,直到达到segment header block size的限制。如:SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 SEG LST:: flg: USED lhd: 0x01c0008d ltl: 0x01c0008d XCT LST:: flg: USED lhd: 0x01c0008c ltl: 0x01c0008a xid: 0x0008.01f.000003d2可以看到当删除数据使block重新可用的时候,位于freelist header处的是最后被分配的block,最先分配的block则处于freelist tail处。其中xid记录的是这次DML操作的transaction id。问题:为什么最后被分配的block被放置在freelist header处?5。当重新insert数据或者发生row migration的时候,会从transaction free list header开始使用已经释放了的空闲block。如果transaction free list中没有 previously freed blocks,那么就从process free list中寻找,因为可能定义了多个freelist,所以到底从哪个free list中找,算法是(P % NFL) + 1,其中P表示DML操作进程的Process ID,NFL表示Process free lists number。如果在process free list中找不到或者根本就没有process free list(segment只有一个freelist的情况),那么再从main free list中找。仍然找不到的话,返回去再查transaction free list,判断其中的transation是否已经commit,如果已经commit了,则把这个transaction free list的flag标志为unused,同时把位于这个list中的所有block合并到main free list中。