总结了一下REORG的操作经验
当数据库里某个表中的记录变化量很大时,需要在表上做REORG操作来优化数据库性能。值得注意的是,针对数据库对象的大量操作,如反复地删除表,存储过程,会引起系统表中数据的频繁改变,在这种情况下,也要考虑对系统表进行REORG操作。
由于DB2使用CBO作为数据库的优化器,数据库对象的状态信息对数据库使用合理的ACCESS PLAN至关重要。
一个完整的REORG表的过程应该是由下面的步骤组成的:RUNSTATS -> REORGCHK -> REORG -> RUNSTATS -> BIND或REBIND
0 执行下面命令前要先连接数据库
1 RUNSTATS由于在第二步中REORGCHK时可以对指定的表进行RUNSTATS操作(在REORGCHK时指定UPDATE STATISTICS),所以第一步事实上是可以省略的。
2 REORGCHKREORGCHK命令的语法如下:>>-REORGCHK----+----------------------------+-------------------> | .-UPDATE--. | '--+-CURRENT-+---STATISTICS--'>-----+---------------------------+---------------------------->< | .-USER-------. | '-ON TABLE--+-SYSTEM-----+--' +-ALL--------+ '-table-name-'REORGCHK是根据统计公式计算表是否需要重整。对于每个表有3个统计公式,对索引有3个统计公式(版本8开始有5个公式),如果公式计算结果该表需重整,在输出的REORG字段中相应值为*,否则为-。
如果数据库中数据量比较大,在生产系统上要考虑REORGCHK的执行时间可能较长,需安排在非交易时间执行。
可以分为对系统表和用户表两部分分别进行REORGCHK:
1) 针对系统表进行REORGCHKdb2 reorgchk update statistics on table system使用UPDATE STATISTICS参数指定数据库首先执行RUNSTATS命令。
2) 针对用户表进行REORGCHKdb2 reorgchk update statistics on table user
下面是执行的部分结果db2 reorgchk update statistics on table user执行 RUNSTATS ....
表统计信息:
F1: 100 * OVERFLOW / CARD < 5F2: 100 * (Effective Space Utilization of Data Pages) > 70F3: 100 * (Required Pages / Total Pages) > 80
SCHEMA NAME CARD OV NP FP ACTBLK TSIZE F1 F2 F3 REORG----------------------------------------------------------------------------------------DB2INST1 STAFF - - - - - - - - -*-...
索引统计信息:
F4: CLUSTERRATIO 或正常化的 CLUSTERFACTOR > 80F5: 100 * (KEYS * (ISIZE + 9) + (CARD - KEYS) * 5) / ((NLEAF - NUM EMPTY LEAFS) * INDEXPAGESIZE) > 50F6: (100 - PCTFREE) * ((INDEXPAGESIZE - 96) / (ISIZE + 12)) ** (NLEVELS - 2) * (INDEXPAGESIZE - 96) / (KEYS * (ISIZE + 9) + (CARD - KEYS) * 5) < 100F7: 100 * (NUMRIDS DELETED / (NUMRIDS DELETED + CARD)) < 20F8: 100 * (NUM EMPTY LEAFS / NLEAF) < 20
SCHEMA NAME CARD LEAF ELEAF LVLS ISIZE NDEL KEYS F4 F5 F6 F7 F8 REORG-------------------------------------------------------------------------------------------------表:DB2INST1.STAFF DB2INST1 ISTAFF - - - - - - - - - - - - -----...
从上面的例子来看,对于表DB2INST1.STAFF,根据统计公式F2计算结果,有必要对表进行REORG。
3 REORG TABLEREORG TABLE命令的语法如下:>>-REORG TABLE--table-name----+--------------------+------------> '-INDEX--index-name--'>-----+-----------------------+-------------------------------->< '-USE--tablespace-name--'执行REORG可以考虑分为表上有索引和没有索引两种情况:
1) 如果表上有索引如表名为DB2INST1.STAFF,索引名为DB2INST1.ISTAFF,命令如下:db2 reorg table db2inst1.staff index db2inst1.istaff use tempspace1
建议REORG时使用USE参数指定数据重排时使用的临时表空间,否则,REORG工作将会在表所在表空间中原地执行。如果表上有多个索引,INDEX参数值请使用最为重要的索引名。
2) 如果表上没有索引如表名为DB2INST1.STAFF, SYSIBM.SYSTABLESdb2 reorg table db2inst1.staff use tempspace1db2 reorg table sysibm.systables use tempspace1
4 RUNSTATSRUNSTATS命令的语法如下:>>-RUNSTATS ON TABLE--table-name-------------------------------->>-----+-+--------------------------------------------------------------------+-+> | '-WITH DISTRIBUTION--+--------------------------------------------+--' | | '-AND--+----------+--+-INDEXES ALL--------+--' | | '-DETAILED-' '-INDEX--index-name--' | '-+--------------------------------------------------+-------------------' '--+-AND-+---+----------+--+-INDEXES ALL--------+--' '-FOR-' '-DETAILED-' '-INDEX--index-name--'>-----+--------------------------+----------------------------->< | .-CHANGE----. | '-SHRLEVEL--+-REFERENCE-+--'
如果表名为DB2INST1.STAFF,表上有索引,则可以用下面的例子完成RUNSTATS命令:db2 runstats on table db2inst1.staff with distribution and detailed indexes all
5 (可选) 上面命令完成后可以重复第二步,检查REORG的结果,如果需要,可以再次执行REORG和RUNSTATS命令。
6 BIND或REBINDRUNSTATS命令运行后,应对数据库中的PACKAGE进行重新联编,简单地,可以使用db2rbind命令来完成。
db2rbind命令的语法如下:>>-db2rbind--database--/l logfile----+------+-------------------> '-all--' .-conservative--.>-----+-------------------------+--/r--+-any-----------+------->< '-/u userid--/p password--'
例如,如果数据库名为SAMPLE,执行:db2rbind sample -l db2rbind.out