Db2 z/OS中SYSIBM.SYSTABLES.CARDF与COUNT(*)结果不一致原因咨询
Db2 z/OS中SYSTABLES.CARDF与COUNT(*)结果不一致的原因
在Db2 z/OS环境下,执行以下查询从系统表获取的行数:
SELECT CARDF AS "ROW_COUNT" FROM SYSIBM.SYSTABLES TABLES WHERE TYPE = 'T' AND "OWNER" = 'MY_SCHEMA' AND NAME = 'MY_TABLE' ;
与直接统计全表行数的查询结果存在差异:
SELECT COUNT(*) AS "ROW_COUNT" FROM MY_SCHEMA.MY_TABLE ;
截图中左侧数字为系统表查询结果,右侧为COUNT(*)的统计结果。该表无CLOB或BLOB字段,但包含大VARCHAR列。
导致结果不一致的核心原因如下:
- CARDF是统计估算值,非实时精确数据:SYSTABLES.CARDF存储的是表的统计行数,由
RUNSTATS操作生成。如果表数据发生增删改后未重新执行RUNSTATS,这个值就会和实际行数产生偏差。 - 大VARCHAR列的统计方式影响:即便没有LOB字段,当大VARCHAR列存在时,若
RUNSTATS未指定DETAILED选项,Db2会采用抽样估算的方式统计行数,而非全表扫描计数,这会导致CARDF与实际行数出现误差。 - COUNT(*)返回实时精确行数:COUNT(*)会直接扫描表的所有数据行(或借助合适索引),返回当前表的精确行数,不受统计信息的时效性和估算方式影响。
解决建议:
- 重新执行
RUNSTATS ON TABLE MY_SCHEMA.MY_TABLE,若需要更精确的统计结果,可添加DETAILED选项,之后再查询SYSTABLES.CARDF,结果会与COUNT(*)更接近。 - 若需获取精确行数,优先使用COUNT(*)或
SELECT COUNT(1),不要依赖系统表的统计字段。
内容的提问来源于stack exchange,提问作者Pwnstar
相关产品推荐
相关产品推荐

