ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于Freelists和Freelist Groups

关于Freelists和Freelist Groups

原创 Linux操作系统 作者:zhouly1861 时间:2009-03-22 19:43:54 0 删除 编辑

数据库读取的单位是数据块(block),一个block是否允许写入数据是基于一定的空闲度--PCTFREE和PCTUSED存储参数设置。
Freelists就是一个指定了所有可以用于insert操作的数据块的列表。
存在于这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了PCTFREE参数指定的限度)则立刻从这个列表中被摘除。
Freelists的作用就在于管理高水位标志(HWM)以下的空闲空间。
Freelist只是管理高水位标志以下的空闲空间,而实际上一个segment可用的空闲空间包括两种类型:
1.已经分配给这个segment但是从来未被使用过的位于高水位标志之上的blocks。
2.位于高水位标志之下,被链接在Freelists上的blocks。
Oracle 9i中,在LMT(Locally Managed Tablespaces)中如果指定了ASSM(Automatic Segment Space Management),那么对于任何PCTUSED、Freelists、Freelist Groups存储参数的指定都将被忽略。
Freelists存储在哪里?
存储在每个segment的header block中,可以通过
sec@secooler> create table t_manual (col1 number);
sys@secooler> select file_id,block_id from dba_extents where segment_name  = 'T_MANUAL';

   FILE_ID   BLOCK_ID
---------- ----------
         5          9
sys@secooler> alter system dump datafile 5 block 9;
使用Oracle提供的两个函数将块地址转化为可以供使用的文件号和块号
sys@secooler> select dbms_utility.data_block_address_file(29360138) from dual;
sys@secooler> select dbms_utility.data_block_address_block(29360138) from dual;
每次当一个block被加入到free list中时,该block会被放置在free list的链表头部。
设置Freelist Groups参数大于1就是设置了多个MFL(Master Free list),这样就缓解了对于MFL的争用。
关于Freelists和Freelist Groups的一个比喻:
想象有一台饮水机和源源不断的急需喝水的人们,一台饮水机就代表一个free list,而一个想喝水的人就是一个准备向segment中插入数据的会话。如果只有一个饮水机,那么所有想喝水的人都必须要排成一队,然后前一个喝完了下一个才能喝,这就产生了争用。设想一下现在放置10个饮水机,很明显人们可以排到10个队伍中的任何一个队伍里,毫无疑问,效率将大大提高。这里瓶颈又出现了,就是如果一个饮水机里的水被喝完了,就得给这个饮水机加水,此时如果只有一个加水员(这就是一个Freelist Group),那么加水的速度可能就会跟不上了,添加Freelist Group就是增加加水员,增加到2个,每个人负责5个饮水机(体现在参数上,是Freelists 5 Freelist Groups 2),那么效率又提升了。
对于空间浪费的负面影响,可以继续设想一下,来了一个十分能喝水的人,他守住一个饮水机不停地喝,喝完了,引水员就加水,又喝完了,又加,即使是其他的9个饮水机里都是满满的水也没用,因为这个人一旦从某个送水员管辖下的饮水机中开始喝水,就不会换到另外一个送水员管理的饮水机上去(一个会话一旦从某个Freelist Group的Freelist中开始读取空闲块,就不会再使用其他Freelist Group中的Freelist,即使其他的Freelist中还有很多的空闲块)。
相关的等待事件:
1.Buffer Busy Waits
2.Enqueue
select /*+rule*/ s.username, e.owner, e.segment_name, s.p1 "File#", s.p2 "Block#"
from v$session s, v$session_wait w, dba_extents e
where w.event = 'buffer busy waits'
and s.sid = w.sid
and e.file_id = s.p1
and s.p2 between e.block_id and e.block_id + (e.blocks - 1);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8797129/viewspace-573365/,如需转载,请注明出处,否则将追究法律责任。

上一篇: V$LOCK
下一篇: 动态SQL
请登录后发表评论 登录
全部评论

注册时间:2008-08-03

  • 博文量
    53
  • 访问量
    106476