不让链化现象影响数据库性能
2009-06-09 13:15:34 来源:WEB开发网二、 如何避免链化现象?
当数据库发现有链化现象时,就需要及时调整相关设置,来避免这种情况。造成链化现象的主要原因是由于块的大小设置不合适所造成的。如果一个数据块的大小不能够容纳一条记录,那么就容易造成链化现象。所以如果适当调整数据块的大小,能够在很大程度上避免这个链化现象。在Oracle数据库中,为了有效避免链化现象,可以通过调整参数PCTFREE来实现。这个参数的主要用途就是为更新一个块所保留的空间。有时候系统默认的值往往不能够满足需求。为此需要数据库管理员根据实际需要设置合适的值。值得注意的是,这个值可以根据表来进行设置。为此如果数据库管理员认为某张表的记录可能比较长,需要占用比较大的空间时,则可以针对这张表设置比较大的块。
虽然通过调整PCTFREE参数可以有效避免链化现象。但是有时候表设计不当也是造成这个问题的主要原因之一。如有一张表M_PRODUCT表格,用来存放产品信息。在这张表中,其产品信息主要分为成品与原材料两类。其中原材料这类产品中,在系统中需要记录详细的产品规格信息,而且还需要同时记录中英文内容。所以光这个产品规格,中英文加起来最多的就有3000个左右的字符。而成品信息的话相对来说比较简单。此时这个表中的记录就存在着两极分化的现象。有些记录的容量很大,需要利用多个数据块来进行保存,就发生了链化现象。而有些记录的话,容量不是很大。此时虽然可以通过给这个表设置比较大的数据块来解决这个链化现象;但是同时也会浪费数据空间。因为还有大部分记录的话,根本用不到这么大的块空间。所以在这种情况下,片面调整PCTFREE参数,会降低硬盘空间的利用率。此时,笔者认为最好能够调整数据库表格的设计。如可以将产品规格字段保存在另外一个表格中,然后通过关键字连接到Product表格中。如此的话,在Product表格中,所有记录的的长度都会差不多。此时再根据需要来调整PCTFREE参数,不仅可以有效避免链化现象,而且还同时提高了硬盘空间的利用率。当然,对于新建立的表格,需要适当的提高PCTFREE参数,避免其出现链化现象。不过这个基表的调整,对于已经投入使用的数据库系统来说,调整的动作有点大,会影响用户的正常使用。为此在数据库设计的时候,就需要跟用户充分的沟通。在数据库初始化设计时,就能够预见到这种情况。所以笔者一直强调,数据库优化一定要做在前。
另外,如果数据库中的记录很少更新,如一些决策分析系统或者数据仓库,其只有在刚开始的时候需要大量的导入数据。导入数据后对数据库中的内容基本上不会再更新。此时不需要把PCTFREE参数设置的太大。可以设置比较小的值,能够提高硬盘空间的利用率,让表空间存储更多的记录。可见,PCTFREE参数的大小没有一个固定的参考标准。其主要根据数据库的用途、表中记录的更新程度、记录的大小等等决定的。如何确定一个合理的PCTFREE参数值,以减少链化现象同时提高表空间的利用率,这也正是数据库优化的难点与挑战所在。
更多精彩
赞助商链接