oracle数据库表_笔记3:FREELIST
FREELIST
使用MSSM表空间时,Oracle会在自由列表(FREELIST)中为有自由空间的对象维护HWM以下的块。
每个对象都至少有一个相关的FREELIST,使用块时,可能会根据需要把块放在FREELIST上或者从FREELIST删除。需要说明的重要一点时,只有位于HWM以下的对象块才会出现在FREELIST中。仅当FREELIST为空时才会使用HWM之上的块,此时Oracle会推进HWM,并把这些块增加到FREELIST中。采用这种方式,Oracle会延迟到不得已时才增加对象的HWM。
一个对象可以有多个FREELIST。如果预计到会有多个并发用户在一个对象上执行大量的INSERT或UPDATE活动,就可以配置多个FREELIST,这对性能提升很有好处(但是可能要以额外的存储空间为代价)。根据需求配置足够多的FREELIST非常重要。
如果存在多个并发的插入和更新,在这样一个环境中,FREELIST可能对性能产生巨大的影响(可能是促进,也可能是妨碍)。
只需把FREELIST设置得相当高,然后就万事大吉了,是这样吗?当然不是。使用多个FREELIST时,有一个主FREELIST,还有一些进程FREELIST。如果一个段只有一个FREELIST,那么主FREELIST和进程FREELIST就是这同一个自由列青天。如果有两个FREELIST,实际上将有一个主FREELIST和两个进程FREELIST。对于一个给定的会话,会根据其会话ID的散列值为之指定一个进程FREELIST。目前,每个进程FREELIST都只有很少的块,余下的自由块都在主FREELIST上。使用一个进程FREELIST时,它会根据需要从主FREELIST拉出一些块。如果主FREELIST无法满足空间需求,Oracle就会推进HWM,并向主FREELIST中增加空块。过一段时间后,主FREELIST会把其存储空间分配给多个进程FREELIST。因此,每个进程会使用一个进程FREELIST。它不会从一个进程FREELIST到另一个进程FREELIST上寻找空间。这说明,如果一个表上有10个进程FREELIST,而且你的进程所用的进程FREELIST已经用尽了该列表中的自由缓冲区,它不会到另一个进程FREELIST上寻找空间,即使另外9个进程FREELIST都分别有5个块,此时它还是会去求助主FREELIST。假设主FREELIST无法满足这样一个自由块请求,就会导致表推进HWM,或者如果表的HWM无法推进(所有空间都已用),就要扩展表的空间(得到另一个区段)。然后这个进程仍然只使用其FREELIST上的空间(现在不再为空)。
使用多个FREELIST时要有所权衡。一方面,使用多个FREELIST可以大幅提升性能。另一方面,有可能导致表不太必要地使用稍多的磁盘空间。
不要低估了FREELIST参数的用处,特别是在Oracle8.1.6及以后版本中,可以根据意愿自由地将其改大或改小。可以把它修改为一个大数,从而与采用传统路径模式的SQL*Loader并行完成数据的加载。
在某些情况下,与MSSM相比,ASSM会使用额外一些空间,因为它试图将插入分布在多个块上。不过大多数情况下,额外使用的空间都是微不足道的,减少并发问题远比这点损失更重要。有些环境下存储空间利用率可能很重要,而不太重视并发性(这让人很快想到数据仓库),这时不一定会从ASSM管理的存储空间获益。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5278.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
