如何使用REORG TABLE命令优化数据库性能

总结了一下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

你可能感兴趣的:(table)