如何从DB2的SYSIBM获取所有持久化表总记录数?CARD字段值不符
从DB2的SYSIBM视图统计所有持久化表总记录数的可行方法
你用SYSIBM.SYSTABLES里的CARD字段得不到准确记录数是正常的——这个字段是DB2通过RUNSTATS收集的估算统计值,不是实时同步的实际记录数。如果表有大量增删改操作但没重新执行统计收集,CARD和实际数据差异会很大。
下面是两种可行的处理方式:
1. 用SYSSTAT.TABLES获取相对准确的统计值
SYSSTAT模式下的视图是专门用于统计查询的,通常比SYSIBM的视图更可靠,统计信息也更及时。查询语句:
SELECT TABNAME, CARD, STATS_TIME FROM SYSSTAT.TABLES WHERE TYPE = 'T' -- 只筛选持久化表,排除视图、临时表等对象
如果这个值还是不准,先执行RUNSTATS更新对应表的统计信息:
-- 单表更新统计 RUNSTATS ON TABLE 你的模式名.表名 WITH DISTRIBUTION AND DETAILED INDEXES ALL;
要是需要批量更新所有表的统计信息,可以写个简单的存储过程或者脚本循环处理。
2. 实时计算准确记录数(性能开销大)
如果必须要绝对准确的记录数,只能对每个表执行COUNT(*)。但对大表来说这个操作很慢,不建议批量跑全量表。可以用动态SQL自动生成查询语句:
SELECT 'SELECT ''' || TABNAME || ''' AS TABNAME, COUNT(*) AS RECORD_COUNT FROM ' || CREATOR || '.' || TABNAME || ' UNION ALL' FROM SYSIBM.SYSTABLES WHERE TYPE = 'T' AND CREATOR = '你的模式名';
把生成的SQL语句去掉最后一个UNION ALL,执行后就能拿到每个表的准确记录数。
内容的提问来源于stack exchange,提问作者max092012
相关产品推荐
相关产品推荐

