PCTFree与PCTUsed是对ORACLE最小存储空间块(block)的设置,设置的百分数都是指定一个块内的百分数。ORACLE中被使用的块的空间不是全部都存储了数据。比如说db_block_size为8k并不能存储8k的数据。
PCTFREE参数用来告诉Oracle应该在块上保留多少空间来完成将来的更新。默认情况下,这个值是10%。如果自由空间的百分比高于 PCTFREE中的指定值,这个块就认为是“自由的”。PCTUSED则告诉Oracle当前不“自由”的一个块上自由空间百分比需要达到多大才能使它再次变为自由的。默认值是40%。
PCTFREE有3 种设置:太高、太低和刚好。如果把块的PCTFREE设置得过高,就会浪费空间。如果把PCTFREE设置为50%,而你从未更新数据,那么每个块都会浪 费50%的空间。不过,在另一个表上,50%可能非常合理。因为在改变行的大小的时候,行已经确定在哪个BLOCK里了,如果行初始很小,现在想将行的大小加倍,但是倘若PCTFREE设置得太小,不足以存储行加倍需要的容量,更新行时就会导致 行迁移。
行迁移会导致性能问题。在通过索引查询时,索引找到某一行对应的一个块,这样就可以得到这一行数据,如果有行迁移,必须多执行一次I/O操作才可以得到一行数据,单独一次操作问题不大,但是在多用户并发读取同一行时,性能问题就会显现出来。
所以,现在我们再回到PCTFREE,来说明这个参数的作用:如果设置得当,这个参数可以帮助你尽量减少行串链。
又引出一个问题。怎样设置PCTFREE和PCTUSED值??
需要按照应用的需要来灵活设置了。
1)高PCTFREE,低PCTUSED:如果你插入了将要更新的大量数据,而且这些更新会频繁地增加行的大小,此时就适合采用这种设置。
2) 低PCTFREE,高PCTUSED:如果你只想对表完成INSERT或DELETE,或者如果你确实要完成UPDATE,但UPDATE只是缩小行的大小,此时这种设置就很适合。 在数据仓库系统中,比较适合,PCTFREE可以设置得很低,因为几乎没有更新操作。