前阵子另外一个团队的同事想获取生产数据库的一些信息(空表,行数之类的), 因此就花了点时间调查DB2自己是如何提供数据库元数据的。发现借助DB2 System Catalog Views 能够帮助咱们比较轻松地统计一些数据库信息数据库
SELECT tabname FROM SYSCAT.TABLES WHERE tabschema='SCHEMA_NAME' AND type='T' AND card=0;
注:SCHEMA NAME必须是大写bash
SELECT tabname, colname, colcard, high2key FROM syscat.columns WHERE tabschema='SCHEMA_NAME' AND ( colcard=0 OR ( colcard=1 AND ( high2key='' OR high2key='''''' ) ) );
赶时间随手写的,见笑了优化
#!/bin/bash SCHEMA=$1 DBNAME=$2 : ${SCHEMA:="DB2INST1"} db2 connect to $DBNAME echo "" > /tmp/rownumber.txt for t in `db2 -x "select tabname from syscat.tables where tabschema = '$SCHEMA' and type = 'T'"`; do db2 "select '{', '$t', '}', '{', count(1), '}' from $SCHEMA.$t" >> /tmp/rownumber.txt; done awk '/{*}/ {print $2,$5}' /tmp/rownumber.txt > /tmp/tables.txt
统计信息应该是被及时更新,由于这些信息可能会被用来帮助优化器优化查询之类,不许确的统计数据有可能反而形成反效果code
AUTO_RUNSTATS
首先链接到目标数据库 db2 connect to DB_NAME
而后执行 db2 get db config | grep runstats
或 db2 get db cfg | grep runstats
若是开启的话会看到Automatic runstats (AUTO_RUNSTATS) = ON
若是是OFF
,可以使用命令 db2 update db cfg using auto_runstats on
开启get
可是统计是须要时间的,尤为数据量达到百万级以上的时候,不少数据库可能就不会选择开启自动计算统计信息了,这时想获取最新的统计信息咱们能够选择手动方式it
假如发现某个表的统计信息比较老,可手动更新那个表的信息(更新syscat.*内的信息)db2 runstats on table table_name with distribution and detailed indexes all
io