分类: Oracle
2008-04-15 12:45:37
来源:赛迪网 作者:Alizze |
PCTFREE的使用
在Oracle中表的每一行数据由唯一的ROWID标记;而Oracle支持的数据类型中有一些长度是可变的,如VARCHAR,当对这些数据进行UPDATE时,如果块中的可用空间不能容纳UPDATE后的数据行时,Oracle将会把此行移到其它数据块,同时保留此数据行的ROWID不变,并在原有块中建一指针指向行迁移后的位置。在这种情况下读取一行数据将需要访问2个数据块,从而导致性能下降。PCTFREE保留的空间就是为确保更改后的数据行可以仍存放于原有数据块中,避免行迁移的情况发生。
由此,如果PCTFREE设置不足时可能产生行迁移;而另一方面如果PCTFREE设置过高,将会造成空间浪费。因此正确设置PCTFREE需要对表中数据的使用进行分析。对于数据长度不会变化或极少更新的情况,可以采用较小的PCTFREE;对于其它大多数情况应采用稍大的PCTFREE(PCTFREE的缺省值是10,如果不好估计需预留的空间,可以使用15-25的范围),不要为节约块中的空间而使用较小的PCTFREE值。
PCTUSED的使用
当块的使用的空间下降到PCTUSED后,此块被重新放回空闲链表(Freelist)中,作为后续Insert的候选块。同样,设置PCTUSED需要视数据行的特性和Insert、Update、Delete的模式而定,但必须遵守的原则是:db_block_size * (100 - PCTFREE - PCTUSED)必须比行的长度大。
对于数据行长度变化较大的情况,应使用最大行长度来计算PCTUSED,并且应使用较低的PCTUSED值。因为在执行Insert时,如果数据块的可用空间不能装下一行数据,当块的使用的空间是在PCTUSED之上,Oracle将把此块从Freelist中移走;当块的使用的空间是在PCTUSED之下,Oracle将会扩展段空间。因此,PCTUSED如果设得过高,将导致段的不断扩展。
当数据行长度不大时,使用缺省的PCTUSED(40)是比较合适的;对于行长度较大的情况,最长的行有可能会占用半个以上的块空间,此时可设置PCTUSED为10。较小的PCTUSED仅在表中的数据以随机方式被删除,而且仍有一些行长时间保留在块中时,才会造成空间使用上的问题,因为这些块可能需要较长的时间才能或永远不能重新被用于存放新数据。在这种应用中,如果空间利用率一直处于较低水平,则需对PCTUSED进行分析和调整。 |