注册
DM8-统计含大字段表的实际数据量
专栏/技术分享/ 文章详情 /

DM8-统计含大字段表的实际数据量

祢真伟大 2026/01/09 269 0 0
摘要

DM8-统计含大字段表的实际数据量

1 环境说明

  • Cpu arm
  • Os 麒麟 v10
  • dm8.1-4-80 pack32
  • –03134284368-20250902-290952-20149 Pack32
  • 在数据库迁移前,通常需要收集源端的以下统计信息:表总数、每张表的数据量、以及含大字段的表数量。基于这些数据,可合理规划迁移批次与实施方案。以下 SQL 脚本可分别统计全部表、含大字段的表、以及不含大字段的表的数据量。

2 创建全局临时表

-- 创建全局临时表(只创建一次) CREATE GLOBAL TEMPORARY TABLE T_SUM ( OWNER VARCHAR(128), --用户名 TAB_NAME VARCHAR(512), --表名 ROW_NUM INT --数据量 ) ON COMMIT DELETE ROWS;

3 多种方法统计表的数据量

-- 下面可重复执行查询表中数据量 COMMIT; DECLARE T_SUM INT; SQL_TEXT VARCHAR(1000); -- ========== 【关键控制参数】========== --查询指定某个用户或模式里面的表; 查询多个用户或模式里面表,需要修改下面V_USER条件 V_USER VARCHAR(128):= 'SYSDBA'; -- 可选值: 'ALL' 全部 | 'WITH_LOB' 含大字段 | 'WITHOUT_LOB' 不含大字段 MODE_FLAG VARCHAR(20) := 'WITH_LOB'; -- =================================== -- 游标类型(用于动态打开不同查询) TYPE TABLE_CURSOR_TYPE IS REF CURSOR; TABLE_CUR TABLE_CURSOR_TYPE; -- 游标返回的记录结构 V_OWNER VARCHAR(128); V_TAB_NAME VARCHAR(512); BEGIN T_SUM := 0; -- 根据 MODE_FLAG 动态选择要遍历的表集合 IF MODE_FLAG = 'ALL' THEN OPEN TABLE_CUR FOR SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE OWNER IN V_USER --OWNER NOT IN ('SYS','SYSSSO','SYSDBA','SYSJOB') ORDER BY TABLE_NAME; ELSIF MODE_FLAG = 'WITH_LOB' THEN OPEN TABLE_CUR FOR SELECT DISTINCT ATC.OWNER, ATC.TABLE_NAME FROM ALL_TAB_COLUMNS ATC WHERE ATC.OWNER IN V_USER --ATC.OWNER NOT IN ('SYS','SYSSSO','SYSDBA','SYSJOB') AND ATC.DATA_TYPE IN ( 'TEXT', 'CLOB', 'NCLOB', 'BLOB', 'IMAGE', 'LONG', 'LONGVARCHAR','LONGVARBINARY' ) ORDER BY ATC.TABLE_NAME; ELSIF MODE_FLAG = 'WITHOUT_LOB' THEN OPEN TABLE_CUR FOR SELECT AT.OWNER, AT.TABLE_NAME FROM ALL_TABLES AT WHERE AT.OWNER IN V_USER --AT.OWNER NOT IN ('SYS','SYSSSO','SYSDBA','SYSJOB') AND NOT EXISTS ( SELECT 1 FROM ALL_TAB_COLUMNS ATC WHERE ATC.OWNER = AT.OWNER AND ATC.TABLE_NAME = AT.TABLE_NAME AND ATC.DATA_TYPE IN ( 'TEXT', 'CLOB', 'NCLOB', 'BLOB', 'IMAGE', 'LONG', 'LONGVARCHAR','LONGVARBINARY' ) ) ORDER BY AT.TABLE_NAME; ELSE RAISE_APPLICATION_ERROR(-20001, 'INVALID MODE_FLAG. USE: ALL / WITH_LOB / WITHOUT_LOB'); END IF; -- 遍历游标中的每张表 LOOP FETCH TABLE_CUR INTO V_OWNER, V_TAB_NAME; EXIT WHEN TABLE_CUR%NOTFOUND; -- 构造安全的 COUNT 查询(双引号包裹表名) SQL_TEXT := 'SELECT COUNT(1) FROM "' || V_OWNER || '"."' || V_TAB_NAME || '"'; EXECUTE IMMEDIATE SQL_TEXT INTO T_SUM; INSERT INTO T_SUM (OWNER, TAB_NAME, ROW_NUM) VALUES (V_OWNER, V_TAB_NAME, T_SUM); END LOOP; CLOSE TABLE_CUR; END; / -- 查询结果 SELECT OWNER AS _USER, SUM(ROW_NUM) AS _ROWS FROM T_SUM GROUP BY OWNER ; SELECT * FROM T_SUM ORDER BY ROW_NUM DESC,OWNER, TAB_NAME;

4 更多达梦数据库全方位指南:安装 优化 与实战教程

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服