段空间管理中的PCTFREE、PCTUSED和FREELISTS

在早期的手动空间管理阶段,Oracle通过一种列表结构FREE LIST来记录数据块的使用情况。需要为每个段设置几个参数。

PCTFREE定义数据块中空闲空间百分比

PCTUSED定义数据块被使用的空间百分比

FREELISTS每个段使用的空闲列表数量

PCTFREE存储参数告诉ORACLE什么时候应该将数据块从对象的空闲列表中移出。ORACLE的默认参数是PCTFREE=10;也就是说,一旦一个INSERT操作使得数据块的90%被使用,这个数据块就从空闲列表(free list)中移出。
PCTUSED存储参数告诉ORACLE什么时候将以前满的数据块加到空闲列表中。当记录从数据表中删除时,数据库的数据块就有空间接受新的记录,但只有当填充的空间降到PCTUSED值以下时,该数据块才被连接到空闲列表中,才可以往其中插入数据。PCTUSED的默认值是PCTUSED=40。


存储参数规则小结 
(1)PCTUSED较高意味着相对较满的数据块会被放置到空闲列表中,从而有效的重复使用数据块的空间,但会导致I/O消耗。PCTUSED低意味着在一个数据块快空的时候才被放置到空闲列表中,数据块一次能接受很多的记录,因此可以减少I/O消耗,提高性能。 
(2)PCTFREE的值较大意味着数据块没有被利用多少就从空闲列表中断开连接,不利于数据块的充分使用。PCTFREE过小的结果是,在更新时可能会出现数据记录迁移(Migration)的情况。(注:数据记录迁移(Migration)是指记录在是UPDATE操作扩展了一个VARCHAR2类型的列或BLOB列后,PCTFREE参数所指定的空间不够扩展,从而记录被ORACLE强制迁移到新的数据块,发生这种情况将较严重的影响ORACLE的性能,出现更新缓慢)。
当进行大量更新操作,并且会增加行长度,这时可以设置大的pctfree;当进行大量插入和删除操作,并且不会引起行长度的增加,设置高的pctused,可以快速删除来重新利用释放的空间。
通过设置合适的pctfree和pctused  来避免行链接和行迁移。
行链接是指如果一个数据块无法装下一行的数据,会把为行分配另一个数据块。
行迁移是指如果在一个数据块内进行大量的更新操作,从而引起行长度增加,而此时块内的空闲空间又无法容下这个行,ORACLE会把整行移到另一个数据块,而在原来的块中保留一个指向这个新数据块的指针。

如果PCTFREE的值太大,记录又可能很长,这会引起行链接(ROW-CHAINING),同时空间利用率也不高; 
Row Chaining在初次insert时发生,如果记录大小超过了整个block可用大小,那么记录将会跨越多个block。- PCTFREE的值太大,block的可用于insert的空间就小,so...


如果PCTFREE的值太小,会影响块数据记录的增长,容易引起行迁移(ROW-MIGURATING);     
Row Migrating在update的时候发生,一条原来存储在一个block中的记录由于更新而发生记录长度变大的时候,需要使用block中的空闲空间,如果空闲空间不够,那么整条记录会全部迁移到一个新的block中。- PCTFREE的值太小,block可用于update的空间就小,so...

pctused的值关系到block是否进入freelist,低于pctused的进入。
如果pctused过大,那么可能仅仅是删除了一点儿内容,这个block就又重新被标志为free了,当又增加了一点儿内容(达到了1-pctfree的值),又被从freelist中摘除,频繁操作freelist是影响性能的。
如果pctused过小,那么即使删除了很多内容,也许这个block仍然不被放到freelist中也就仍然不能被用于insert新数据,所以空间浪费。


你可能感兴趣的:(oracle,list,存储,insert,扩展,migration)