1、runstats

runsats可以搜集表的信息,也可以搜集索引信息。作为runstats本身没有优化的功能,但是它更新了统计信息以后,可以让DB2优化器使用最新的统计信息来进行优化,这样优化的效果更好。

 

runstats  on  table  <tbschema>.<tbname>  收集表  <tbname>  的统计信息。表名必须是用  <dbschema>  全限定的。

 

 

1).runstats的语法:
runstats on table [模式名].[表名] with distribution and detailed indexes all
注意:你可以在所有列上,或者仅仅在某些列或列组(除了LONG和LOB列)上执行RUNSTATS。如果没有指定特定列的子句,系统则会使用默认的ON ALL COLUMNS子句。
    使用RUNSTATS WITH DISTRIBUTION
当您已确定表中包含不是统一分布的数据时,可以运行包含WITH DISTRIBUTION子句的RUNSTATS。目录统计信息表通常包含关于表中最高和最低值的信息,而优化器假定数据值是在两个端点值之间均匀分布的。然而,如果数据值彼此之间差异较大,或者群集在某些点上,或者是碰到许多重复的数据值,那么优化器就无法选择一个最佳的访问路径,除非收集了分布统计信息。使用WITH DISTRIBUTION子句还可以帮助查询处理没有参数标志符(parameter marker)或主机变量的谓词,因为优化器仍然不知道运行时的值是有许多行,还是只有少数行。
如果为单一索引进行runstats,可以使用:
runstats on table [模式名].[表名] for indexes [索引名]
   

2).runstats的作用:
一个SQL在写完并运行之后,其实我们只是告诉了DB2去做什么,而不是如何去做。而,具体的如何去做,就取决于优化器。优化器为了生成最优的执行计划,就得掌握当前的系统信息,目录中的统计信息等等。
runstats命令就是用来收集数据库对象的状态信息,这对优化器生成最优的执行计划至关重要。

3).什么时候需要runstats:
·在给表创建一个index后,我们最好做一次runstat,否则可能index没有生效。不过有说法称在8.2版本以后的DB2中,会在INDEX之后自动进行runstats;
·.在对table做了一次reorg后,记得要做一次runstats。因为对表做reorg,会修改表的很多信息,比如高水位等,所以做一次runstats,可以更新统计信息。
·当表里数据发生了比较大的变化,一般来说,大约表里面的数据量的10%-20%发生了变化,就应该作一次runstats。这些变化包括删除,修改,插入。对于一些非常大的表,比方在数据仓库的项目里面,某些事实表非常巨大。这个时候,完整的对一个大表作runstats可能花费时间相当大,DB2 8.1里面支持我们对这些大表作抽样,比方说只对20%的数据作runstats,这样的话,一般来说也能保证得到正确的执行计划。当然首先要确保这个表里面的数据最好分布比较均匀。
·.当你在分区(DPF)数据库里面使用了REDISTRIBUTE DATABASE PARTITION GROUP这个命令,那么就需要用runstats来收集新的统计信息。

4).其他
当表比较小的时候,runstats是一件很普通的事情。但是当表非常大的时候,runstats将会占用相当大的时间,cpu和内存。通常只在关键查询的速度开始减慢时,管理员才会对RUNSTATS给予适当的注意。您可以通过制定高效、有效收集统计信息的策略,避免未经思考就调优查询和执行RUNSTATS。

 

 

 2、reorg

 

 A、 reorg  table  <tbschema>.<tablename>  通过重构行来消除“碎片”数据并压缩信息,对表进行重组。表名必须是用  <dbschema>  全限定的。

 B、

reorg还有一个功能就是可以将表中的数据按照某个索引关键字的顺序排列,从而可以减少某些查询I/O的数量。

 

 

 执行REORG可以考虑分为表上有索引和没有索引两种情况: 

    a.如表名为DB2INST1.STAFF,索引名为DB2INST1.ISTAFF

     reorg table db2inst1.staff index db2inst1.istaff use tempspace1

   b.建议REORG时使用USE参数指定数据重排时使用的临时表空间,否则,REORG工作将会

      在表所在表空间中原地执行.如果表上有多个索引,INDEX参数值请使用最为重要的索

      引名.

   c.表上没有索引:

      reorg table db2inst1.staff use tempspace1

     reorg table sysibm.systables use tempspace1