本节内容:
oracle参数调整PCTFREE、PCTUsed的性能
一、定义
1、PCTFREE、PCTUSED使你能控制一个segment里所有数据块里free space的使用。
PCTFREE:一个数据块保留的用于块里已有记录的可能更新的自由空间占block size的最小比例。
PCTUSED:在新记录被插入block里之前这个block可以用于存储行数据和其他信息的空间所占的最小比率。
2、 PCTFREE、PCTUSED参数的使用
如果创建表的时候指定pctfree=20%,oracle会在这个表的data segment的每个block都保留20%的空间用于已有记录的更新。
Block的已使用空间上升到整个block size的80%时,这个block将移出free list;
在提交了delete、update之后,oracle server处理这条语句并检查对应block的已使用空间是否低于PCTUSED,如果是,则这个block放进free list。
3、PCTFREE、PCTUSED的设定
1)、PCTFREE
2)、PCTUSED
其中,upd : the average alinuxjishu/9952.html target=_blank class=infotextkey>mount added by updates, in bytes。This is determined by subtracting the average row length of intercurrent average row length;
average row length:在运行了analyize命令之后,这个值可以从dba_tables中的avg_row_len列中获得。
rows : the number of rows to be deleted before free list maintenance occurs。
4、Delete、update可以增加block的自由空间,但是释放出来的空间有可能是不连续的,oracle在下列情况下会对碎片进行整理:一个block有足够的自由空间容纳row piece,但是由于每个碎片都较小以至这个row piece不能存放在一个连续的section中。
二、Migration和Chaining
1、如果一行的数据太大以至一个单独的block容纳不下,会产生两种现象:
A、Chaining:行数据太大以至一个空block容纳不下,oracle会将这一行的数据存放在一个或多个block 组成的block chain中,insert、update都可能导致这个问题,在某些情况下row chaining是不能避免的。
B、Migration:一次update操作可能导致行数据增大,以至它所在的block容纳不下,oracle server会去寻找一个有足够自由空间容纳整行数据的block,如果这样的block存在,oracle server把整行移到新的block,在原位置保存一个指向新存放位置的镜像行,镜像行的rowid和原来的rowid一致。
Chaining、Migration的弊端:insert、update的性能降低,索引查询增加了IO次数。
2、检测migration和chaining:
查询镜像行:
Analyize table table_name list chained rows;
ORA-01495: 未找到指定的链接行表(注:如果 Chained_rows 表不存在,会有以上错误。可以通过@?rdbmsadminutlchain.sql 脚本创建该表。)
Select owner_name,table_name,head_rowid from chained_rows where table_name=’...’;
产生Migration的原因可能是由于PCTFREE设置的太低以至没有保留足够的空间用于更新。
可以通过增加PCTFREE的值避免行镜像产生。
3、消除镜像行的步骤:
运行analyize table ... list chained rows;
复制镜像行到另一个表tmp;
从源表中删除这些行;
从tmp中将这些行插回到源表中。
脚本:
注意:使用这个脚本时,必须将涉及到的外键约束去掉。