DB2提供了RUNSTATS命令来手工更新数据库统计信息。在成功执行RUNSTATS命令之后,静态SQL查询并不会使用最近的数据库统计信息,这是因为静态SQL的访问策略在之前执行BIND时就已确定,而当时使用的统计信息有可能与现在的并不一致。这时候就需要重新绑定使用静态sql的应用程序,这样查询优化器就可以根据数据库最新统计信息来选择获取数据库的最佳访问策略。但是,对于使用动态sql的应用程序而言,则没有必要进行重新绑定,因为动态sql语句的访问策略是根据统计信息在运行时动态生成的。
如何更新统计信息
只有当进行显示请求时,对象的统计信息才会在系统目录表中被更新。有以下几种方法可以更新部分或全部统计信息:
- 使用RUNSTATS(运行统计信息,Run Statistics)命令
- 使用带有指定的统计信息收集选项的LOAD
- 对针对一组预先定义的系统目录视图进行操作的SQL UPDATE 语句进行编码
- 使用"reorgchk update statistics"命令
记住:批量加载数据之后要运行RUNSTATS命令
一次对一张表进行RUNSTATS命令:
db2 -v runstats on table tabschema.tabname and indexes all
这个命令将收集该表及其所有索引(基本级别)的统计信息。
查看是否执行了RUNSTATS命令
db2 -v "select tbname,nleaf,nlevels,stats_time from sysibm.sysindexes"
[db2inst1@db22 adm]$ db2 get db cfg for sample | grep -i "heap"
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = AUTOMATIC(5000)
Sort list heap (4KB) (SORTHEAP) = AUTOMATIC(256)
Database heap (4KB) (DBHEAP) = AUTOMATIC(2002)
Utilities heap size (4KB) (UTIL_HEAP_SZ) = AUTOMATIC(5000)
SQL statement heap (4KB) (STMTHEAP) = AUTOMATIC(8192)
Default application heap (4KB) (APPLHEAPSZ) = AUTOMATIC(256)
Statistics heap size (4KB) (STAT_HEAP_SZ) = AUTOMATIC(4384)
[db2inst1@db22 adm]$ db2 get dbm cfg | grep -i "heap"
Database monitor heap size (4KB) (MON_HEAP_SZ) = AUTOMATIC(90)
Java Virtual Machine heap size (4KB) (JAVA_HEAP_SZ) = 2048
Sort heap threshold (4KB) (SHEAPTHRES) = 0
Application support layer heap size (4KB) (ASLHEAPSZ) = 15