Wednesday, August 29, 2012

DB2 空闲页的使用

DB2使用三种算法中的一种来确定将行插入到哪里

1.缺省模式是,DB2搜索散布在表的各页上的自由空间控制记录(Free Space Control Records,FSCR),以找到有足够自由空间存放新行的页。显然,如果每页上的自由空间都比较少的话,就要浪费很多的搜索时间。为了应付这一点,DB2提供了DB2MAXFSCRSEARCH注册表变量,以便允许将搜索范围限制为少于缺省的5页。

2.当表是通过ALTER TABLE以APPEND ON模式放置时,就要使用第二种算法。这样就完全避免了FSCR搜索,因为只需简单地将行直接放到表的末尾。

3.当表有群集索引(clusteringindex)时,就要用到最后一种算法。在这种情况下,DB2试图将每一行插入到有相似键值的一页中。如果那一页没有空间了,DB2就会尝试附近的页,如果附近的页也没有空间,DB2就进行FSCR搜索。

  如果只考虑插入时间的优化,那么使用APPEND模式对于批量插入是最快的一种方法,但是这种方法的效果远不如我们这里讨论的很多其他方法那么成效显着。第二好的方法应该是采用缺省算法,要优化 INSERT 速度(可能的代价是表增长得更加快),将DB2MAXFSCRSEARCH 注册表变量设置为较小的数。要优化空间重用(可能的代价是 INSERT 速度减慢),将 DB2MAXFSCRSEARCH 设置为更大的数。

  如果有群集索引,则对insert的性能会有很大的负面影响,这一点也不惊奇,因为使用群集索引的目的就是通过在插入时做额外的工作来提高查询(即select)性能的。如果的确需要群集索引,那么可以通过确保有足够的自由空间来使其对插入的影响降至最小:使用ALTERTABLE增加PCTFREE,然后使用REORG预留自由空间。不过,如果允许太多自由空间的存在,则可能导致查询时需要读取额外的页,这反而大大违反了使用群集索引的本意。另一种选择是,在批量插入之前先删除群集索引,而后再重新创建群集索引,也许这是最优的方法(创建群集索引的开销跟创建常规索引的开销差不多,都不是很大,只是在插入时有额外的开销


引用:
http://www.ibm.com/developerworks/data/library/tips/dm-0403wilkins/
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0009677.htm

No comments:

Post a Comment