总结了一下REORG的操作经验
当数据库里某个表中的记录变化量很大时,需要在表上做REORG操作来优化数据库性能。
值得注意的是,针对数据库对象的大量操作,如反复地删除表,存储过程,会引起系统表中数据的频繁改变,在这种情况下,也要考虑对系统表进行REORG操作。
由于DB2使用CBO作为数据库的优化器,数据库对象的状态信息对数据库使用合理的ACCESS PLAN至关重要。
一个完整的REORG表的过程应该是由下面的步骤组成的:
RUNSTATS->REORGCHK->REORG->RUNSTATS->BIND或REBIND
0执行下面命令前要先连接数据库
1RUNSTATS
由于在第二步中REORGCHK时可以对指定的表进行RUNSTATS操作(在REORGCHK时指定UPDATESTATISTICS),所以第一步事实上是可以省略的。
2REORGCHK
REORGCHK命令的语法如下:
>>-REORGCHK----+----------------------------+------------------->
|.-UPDATE--.|
'--+-CURRENT-+---STATISTICS--'
>-----+---------------------------+----------------------------><
|.-USER-------.|
'-ONTABLE--+-SYSTEM-----+--'
+-ALL--------+
'-table-name-'
REORGCHK是根据统计公式计算表是否需要重整。
对于每个表有3个统计公式,对索引有3个统计公式(版本8开始有5个公式),如果公式计算结果该表需重整,在输出的REORG字段中相应值为*,否则为-。
如果数据库中数据量比较大,在生产系统上要考虑REORGCHK的执行时间可能较长,需安排在非交易时间执行。
可以分为对系统表和用户表两部分分别进行REORGCHK:
1)针对系统表进行REORGCHK
db2reorgchkupdatestatisticsontablesystem
使用UPDATESTATISTICS参数指定数据库首先执行RUNSTATS命令。
2)针对用户表进行REORGCHK
db2reorgchkupdatestatisticsontableuser
下面是执行的部分结果
db2reorgchkupdatestatisticsontableuser
执行RUNSTATS....
表统计信息:
F1:100*OVERFLOW/CARD<5
F2:100*(EffectiveSpaceUtilizationofDataPages)>70
F3:100*(RequiredPages/TotalPages)>80
SCHEMANAMECARDOVNPFPACTBLKTSIZEF1F2F3REORG
----------------------------------------------------------------------------------------
DB2INST1STAFF---------*-
...
索引统计信息:
F4:CLUSTERRATIO或正常化的CLUSTERFACTOR>80
F5:100*(KEYS*(ISIZE+9)+(CARD-KEYS)*5)/((NLEAF-NUMEMPTYLEAFS)*INDEXPAGESIZE)>50
F6:(100-PCTFREE)*((INDEXPAGESIZE-96)/(ISIZE+12))**(NLEVELS-2)*(INDEXPAGESIZE-96)/(KEYS*(ISIZE+9)+(CARD-KEYS)*5)<100
F7:100*(NUMRIDSDELETED/(NUMRIDSDELETED+CARD))<20
F8:100*(NUMEMPTYLEAFS/NLEAF)<20
SCHEMANAMECARDLEAFELEAFLVLSISIZENDELKEYSF4F5F6F7F8REORG
-------------------------------------------------------------------------------------------------
表:DB2INST1.STAFF
DB2INST1ISTAFF-----------------
...
从上面的例子来看,对于表DB2INST1.STAFF,根据统计公式F2计算结果,有必要对表进行REORG。
3REORGTABLE
REORGTABLE命令的语法如下:
>>-REORGTABLE--table-name----+--------------------+------------>
'-INDEX--index-name--'
>-----+-----------------------+--------------------------------><
'-USE--tablespace-name--'
执行REORG可以考虑分为表上有索引和没有索引两种情况:
1)如果表上有索引
如表名为DB2INST1.STAFF,索引名为DB2INST1.ISTAFF,命令如下:
db2reorgtabledb2inst1.staffindexdb2inst1.istaffusetempspace1
建议REORG时使用USE参数指定数据重排时使用的临时表空间,否则,REORG工作将会在表所在表空间中原地执行。
如果表上有多个索引,INDEX参数值请使用最为重要的索引名。
2)如果表上没有索引
如表名为DB2INST1.STAFF,SYSIBM.SYSTABLES
db2reorgtabledb2inst1.staffusetempspace1
db2reorgtablesysibm.systablesusetempspace1
4RUNSTATS
RUNSTATS命令的语法如下:
>>-RUNSTATSONTABLE--table-name-------------------------------->
>-----+-+--------------------------------------------------------------------+-+>
|'-WITHDISTRIBUTION--+--------------------------------------------+--'|
|'-AND--+----------+--+-INDEXESALL--------+--'|
|'-DETAILED-''-INDEX--index-name--'|
'-+--------------------------------------------------+-------------------'
'--+-AND-+---+----------+--+-INDEXESALL--------+--'
'-FOR-''-DETAILED-''-INDEX--index-name--'
>-----+--------------------------+-----------------------------><
|.-CHANGE----.|
'-SHRLEVEL--+-REFERENCE-+--'
如果表名为DB2INST1.STAFF,表上有索引,则可以用下面的例子完成RUNSTATS命令:
db2runstatsontabledb2inst1.staffwithdistributionanddetailedindexesall
5(可选)上面命令完成后可以重复第二步,检查REORG的结果,如果需要,可以再次执行REORG和RUNSTATS命令。
6BIND或REBIND
RUNSTATS命令运行后,应对数据库中的PACKAGE进行重新联编,简单地,可以使用db2rbind命令来完成。
db2rbind命令的语法如下:
>>-db2rbind--database--/llogfile----+------+------------------->
'-all--'
.-conservative--.
>-----+-------------------------+--/r--+-any-----------+-------><
'-/uuserid--/ppassword--'
例如,如果数据库名为SAMPLE,执行:
db2rbindsample-ldb2rbind.out