[DB2]数据库设计:取得最佳性能的准则 (7)

发表于:2007-05-26来源:作者:点击数: 标签:
7. 空余空间方面的考虑 分配空余空间的主要目的是使数据行的物理顺序与群集索引一致,以减少频繁重组数据的需要。此外,对行的更好的群集会使读访问的速度更快,行插入的速度也更快。然而,过多地分配空余空间可能会产生浪费的DASD空间,导致每次I/O只能传输
7. 空余空间方面的考虑

 

 

  分配空余空间的主要目的是使数据行的物理顺序与群集索引一致,以减少频繁重组数据的需要。此外,对行的更好的群集会使读访问的速度更快,行插入的速度也更快。然而,过多地分配空余空间可能会产生浪费的DASD空间,导致每次I/O只能传输更少的数据,缓冲池的利用效率更低,并且要扫描更多的页。

 

 

  表空间和索引中空余空间的分配是由CREATE或ALTER TABLESPACE以及CREATE或ALTER INDEX语句的PCTFREE和FREEPAGE选项确定的。

 

 

  PCTFREE告诉DB2在装载或重组数据时,表空间或索引中的每个页要留出多少百分比的空余空间。如果没有足够的空余空间来按照恰当的顺序(也就是按群集顺序)编写行或索引,那么DB2就必须将多出的数据放到另一个页上。当越来越多的记录被乱序存放时,性能就会出现问题。

 

 

  FREEPAGE告诉DB2在装载或重组数据时,应该过多久就分配一整页的空余空间。例如,如果指定了FREEPAGE 5,那么DB2将在用数据填充了5个页之后分配一页的空余空间。如果表行大于页宽的一半,则应该使用FREEPAGE,因为在那样的环境下不能在一页上再INSERT一行。

 

 

  是否定义带空余空间的表空间,以及分配多少的空余空间,这很大程度上取决于表空间中表的INSERT特征(其次是DELETE活动)。换句话说,这取决于将行添加到表中的频率,以及将行添加到表的什么地方。下面有4种类别:

 

 

  1) 只读表:如果对于一个表没有任务更新活动,那么可以将其定义为没有空余空间。而且,也没有任何必要去运行REORG实用程序。

 

 

  2) 随机插入:对于已经有很多行、并且INSERT活动的级别很低,那么一开始可以使用默认的PCTFREE(对于表空间,该值是5,对于索引,该值是10)。然后使用RUNSTATS监控数据失序的程度,再考虑您期望运行REORG的频率,对PCTFREE进行必要的上下调整。对于INSERT活动级别很高的表,可能需要使用大于默认值的PCTFREE。对于开始为空或者只包含很少行的表(例如在新数据库的部署期间),可能需要指定一个较高的PCTFREE,并不时地运行一下REORG,直到这个表被填充好为止。

 

 

  3) 在表的末尾插入:如果一个表中的行的长度不会增长,那么就无需分配空余空间,因为这些行是在表的末尾插入的。由于这些行是按照物理的群集顺序来写的,因此不需要运行REORG。但是,如果一个表包含可更新的VARCHAR列,或者该表被压缩,那么有可能行的长度会增长,从而导致某一行被转移到其他页上。您可以通过对表空间执行RUNSTATS,然后检查DB2编目表SYSIBM.SYSTABLEPART的NEARINDREF和FARINDREF这两列来判断上述情况。如果表变得缺乏组织,那么为表空间指定一个PCTFREE,并继续用RUNSTATS监控位置不当(mislocated)的行。根据当前的数据以及您所观察到的趋势,对REORG的频率和PCTFREE的数字进行相应的调整。通过在REORG TABLESPACE中指定INDREFLIMIT和REPORTONLY选项,可以监控被更新的DB2表中位置不当的行的数目,以及隔多远会出现这样的行。

 

 

  4) 在热点(hot spot)中插入:在这种情况下,表上的插入活动很频繁,而且集中在某一个位置(或几个位置),而不是在表的末尾进行插入。这一类情况可能是最难于处理的。可以尝试增加PCTFREE的值。如果插入活动停留在主段(home segment)中,并且插入的行不是很长,那么可以将数行存储在相同的页中。在此情况下,另一种可以考虑的方案是使用FREEPAGE。这时有必要严密监控表变得无组织的速度,这样就可以在性能急剧下降之前运行REORG。

原文转自:http://www.ltesting.net