如何在DB2中获取SYSIBM.SYSTABLES中各表的行数?
当然有办法啦!在DB2里获取SYSIBM.SYSTABLES中各表的行数,我常用这几种实用方案,你可以根据自己的需求和场景选择:
方案一:利用系统统计视图(快速但非实时)
DB2维护了SYSIBM.SYSTABLESTATS视图,存储了表的统计信息,其中CARD字段就是表的行数估算值。这种方法查询速度极快,不用扫描实际表数据,但数据不是实时的,依赖定期执行的RUNSTATS命令更新统计信息。
示例SQL:
SELECT T.TABNAME AS 表名, T.CREATOR AS 模式名, TS.CARD AS 估算行数 FROM SYSIBM.SYSTABLES T JOIN SYSIBM.SYSTABLESTATS TS ON T.TABNAME = TS.TABNAME AND T.CREATOR = TS.CREATOR WHERE T.TYPE = 'T' -- 仅筛选用户表,排除视图、别名等对象 ORDER BY T.CREATOR, T.TABNAME;
如果发现统计数据过时,你可以手动执行RUNSTATS更新单张表的统计信息:
RUNSTATS ON TABLE <模式名>.<表名> WITH DISTRIBUTION AND DETAILED INDEXES ALL;
方案二:动态SQL批量统计(精确但耗性能)
如果需要实时精确的行数,可以通过动态SQL生成每个表的COUNT(*)查询,然后批量执行。这种方法会对每个表做全表扫描,数据绝对准确,但对于大表或大量表来说,会消耗较多数据库资源,建议在业务低峰期执行。
步骤1:生成统计SQL
先执行以下语句生成所有目标表的统计SQL:SELECT 'SELECT ''' || TABNAME || ''' AS 表名, ''' || CREATOR || ''' AS 模式名, COUNT(*) AS 精确行数 FROM ' || CREATOR || '.' || TABNAME || ' UNION ALL' FROM SYSIBM.SYSTABLES WHERE TYPE = 'T' AND CREATOR = '<你的目标模式名>'; -- 指定模式缩小范围,避免无关表步骤2:执行生成的SQL
将生成的结果复制出来,去掉最后一行的UNION ALL,然后执行就能得到所有表的精确行数。进阶:用存储过程自动执行
如果需要自动化批量统计,可以写一个简单的存储过程来完成:BEGIN DECLARE v_tabname VARCHAR(128); DECLARE v_creator VARCHAR(128); DECLARE v_sql VARCHAR(1000); DECLARE v_rowcount BIGINT; -- 先创建临时表存储结果(如果不存在的话) DECLARE CONTINUE HANDLER FOR SQLSTATE '42710' BEGIN END; CREATE GLOBAL TEMPORARY TABLE temp_row_counts ( 模式名 VARCHAR(128), 表名 VARCHAR(128), 行数 BIGINT ) WITH REPLACE ON COMMIT PRESERVE ROWS; -- 遍历目标表 DECLARE cur_tables CURSOR FOR SELECT TABNAME, CREATOR FROM SYSIBM.SYSTABLES WHERE TYPE = 'T' AND CREATOR = '<你的目标模式名>'; OPEN cur_tables; FETCH cur_tables INTO v_tabname, v_creator; WHILE SQLCODE = 0 DO -- 生成统计语句 SET v_sql = 'SELECT COUNT(*) FROM ' || v_creator || '.' || v_tabname; PREPARE stmt FROM v_sql; EXECUTE stmt INTO v_rowcount; -- 插入临时表 INSERT INTO temp_row_counts VALUES (v_creator, v_tabname, v_rowcount); FETCH cur_tables INTO v_tabname, v_creator; END WHILE; CLOSE cur_tables; -- 查询结果 SELECT * FROM temp_row_counts ORDER BY 模式名, 表名; END@
方案三:使用内置函数(便捷但依赖统计信息)
DB2提供了ADMIN_GET_TAB_INFO内置函数,也能返回表的行数信息,本质上还是基于统计数据,和方案一类似,但写法更简洁:
SELECT TABNAME AS 表名, CREATOR AS 模式名, ADMIN_GET_TAB_INFO(CREATOR, TABNAME).CARD AS 估算行数 FROM SYSIBM.SYSTABLES WHERE TYPE = 'T';
总结
- 追求速度、可以接受估算值:选方案一或方案三,记得定期更新统计信息
- 需要精确实时数据:选方案二,注意在低峰期执行,避免影响业务
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

