1. 达梦数据库常用查询语句概述
作为一名长期使用达梦数据库的DBA,我经常需要快速定位和分析数据库中的各种报表数据。达梦作为国产数据库的佼佼者,其系统表结构和Oracle非常相似,这为我们提供了丰富的元数据查询能力。下面这些查询语句都是我在实际工作中反复验证过的,特别适合用来分析报表类数据表。
这些查询主要针对达梦数据库的系统视图(如ALL_TABLES、ALL_OBJECTS等),通过组合不同条件可以快速找出:
- 特定模式的表(如所有包含REPORT关键词的表)
- 表的创建/修改时间
- 表的数据量和大表情况
- 表的时间字段分布
- 公共字段分析
注意:使用这些查询前需要确保你有查询系统视图的权限,通常DBA角色或具有SELECT_CATALOG_ROLE权限的用户可以执行。
2. 基础表查询技巧
2.1 简单表查询与过滤
最基础的查询就是从ALL_TABLES中筛选特定模式的表。我常用以下查询找出所有报表表:
sql复制SELECT TABLE_NAME
FROM ALL_TABLES
WHERE OWNER = 'YXJC'
AND TABLE_NAME LIKE '%REPORT%'
AND TABLE_NAME NOT LIKE '%BKP%' -- 排除备份表
AND TABLE_NAME NOT LIKE '%TMP%' -- 排除临时表
AND TABLE_NAME NOT LIKE '%BAK%' -- 排除备份表
ORDER BY TABLE_NAME;
这里有几个实用技巧:
- 使用
LIKE '%REPORT%'可以匹配表名中包含REPORT的所有表 - 通过多个
NOT LIKE条件排除备份表、临时表等干扰项 OWNER指定模式名,在多租户环境下特别重要
实际工作中,我建议把这些排除规则做成视图,这样后续查询直接基于视图即可,不用每次都写这么长的条件。
2.2 表数据量统计查询
了解表的数据量对于性能优化非常重要。这个查询可以显示表的行数和统计信息更新时间:
sql复制SELECT
TABLE_NAME,
NUM_ROWS,
LAST_ANALYZED,
CASE
WHEN NUM_ROWS > 0 THEN '有数据'
WHEN NUM_ROWS = 0 THEN '无数据'
ELSE '未统计'
END AS STATUS
FROM ALL_TABLES
WHERE OWNER = 'YXJC'
AND TABLE_NAME LIKE '%REPORT%'
ORDER BY NUM_ROWS DESC NULLS LAST;
关键点说明:
NUM_ROWS是统计信息中记录的行数,需要定期收集统计信息才会准确LAST_ANALYZED显示最后一次收集统计信息的时间NULLS LAST确保未统计的表排在最后- CASE语句直观显示表的数据状态
如果发现NUM_ROWS为NULL或明显不准确,需要执行
ANALYZE TABLE命令更新统计信息。我通常设置每周自动收集一次关键表的统计信息。
3. 表变更与空间分析
3.1 近期修改表查询
在排查问题时,我经常需要找出最近修改过的表。这个查询可以显示7天内修改过的表:
sql复制SELECT
OBJECT_NAME AS TABLE_NAME,
CREATED,
LAST_DDL_TIME,
STATUS
FROM ALL_OBJECTS
WHERE OWNER = 'YXJC'
AND OBJECT_TYPE = 'TABLE'
AND OBJECT_NAME LIKE '%REPORT%'
AND LAST_DDL_TIME > SYSDATE - 7
ORDER BY LAST_DDL_TIME DESC;
使用技巧:
LAST_DDL_TIME记录最后一次DDL操作时间,包括ALTER、TRUNCATE等SYSDATE - 7表示7天前的时间,可以根据需要调整- 结合
STATUS字段可以快速发现无效的表
我曾经用这个查询发现了一个异常频繁被修改的报表表,最终定位到一个定时任务配置错误的问题。
3.2 大表识别与分析
大表往往是性能瓶颈的源头。这个查询可以找出大于100MB的表并计算其MB大小:
sql复制SELECT
SEGMENT_NAME AS TABLE_NAME,
BYTES,
ROUND(BYTES/1024/1024, 2) AS MB_SIZE
FROM DBA_SEGMENTS
WHERE OWNER = 'YXJC'
AND SEGMENT_TYPE = 'TABLE'
AND SEGMENT_NAME LIKE '%REPORT%'
AND BYTES > 1024*1024*100
ORDER BY BYTES DESC;
注意事项:
DBA_SEGMENTS视图显示的是实际分配的存储空间,可能大于数据实际大小- 对于分区表,需要单独查询每个分区的空间使用情况
- 大表建议考虑分区或归档策略
我发现很多性能问题都是由于报表表没有及时归档导致的。对于超过1GB的报表表,建议评估是否可以使用分区表按时间范围分区。
4. 表字段深度分析
4.1 时间字段分析
报表表通常会有各种时间字段,这个查询可以找出表中的时间类型字段:
sql复制SELECT
A.TABLE_NAME,
C.COLUMN_NAME,
C.DATA_TYPE,
C.NULLABLE,
CASE
WHEN C.COLUMN_NAME = 'CREATE_TIME' THEN '创建时间'
WHEN C.COLUMN_NAME = 'UPDATE_TIME' THEN '更新时间'
WHEN C.COLUMN_NAME = 'CREATE_DATE' THEN '创建日期'
WHEN C.COLUMN_NAME = 'UPDATE_DATE' THEN '更新日期'
ELSE C.COLUMN_NAME
END AS FIELD_DESCRIPTION
FROM ALL_TABLES A
JOIN ALL_TAB_COLUMNS C ON A.OWNER = C.OWNER AND A.TABLE_NAME = C.TABLE_NAME
WHERE A.OWNER = 'YXJC'
AND A.TABLE_NAME LIKE '%REPORT%'
AND C.DATA_TYPE NOT IN ('BIGINT', 'INT', 'NUMERIC', 'VARCHAR', 'CHAR', 'FLOAT', 'DEC', 'NUMBER')
ORDER BY A.TABLE_NAME, C.COLUMN_ID;
实用技巧:
- 通过
DATA_TYPE NOT IN排除了非时间类型的字段 - CASE语句为常见时间字段添加了中文注释
- 可以修改条件专门查找某种命名模式的时间字段
注释掉的复杂条件可以用来查找特定命名模式的时间字段,如各种变体的创建时间、更新时间等。在实际使用中,我通常先运行简化版,再根据需要取消部分注释。
4.2 公共字段分析
了解报表表的公共字段有助于设计统一接口。这个CTE查询可以找出80%以上报表表共有的字段:
sql复制WITH REPORT_TABLES AS (
SELECT DISTINCT TABLE_NAME
FROM ALL_TABLES
WHERE OWNER = 'YXJC'
AND TABLE_NAME LIKE '%REPORT%'
),
COMMON_COLUMNS AS (
SELECT
COLUMN_NAME,
DATA_TYPE,
COUNT(DISTINCT TABLE_NAME) AS TABLE_COUNT,
LISTAGG(TABLE_NAME, ', ') WITHIN GROUP (ORDER BY TABLE_NAME) AS TABLES
FROM ALL_TAB_COLUMNS C
WHERE C.OWNER = 'YXJC'
AND C.TABLE_NAME IN (SELECT TABLE_NAME FROM REPORT_TABLES)
GROUP BY COLUMN_NAME, DATA_TYPE
)
SELECT * FROM COMMON_COLUMNS
WHERE TABLE_COUNT = (SELECT COUNT(*) FROM REPORT_TABLES) -- 所有表都有的字段
OR TABLE_COUNT >= (SELECT COUNT(*) FROM REPORT_TABLES) * 0.8 -- 80%以上表有的字段
ORDER BY TABLE_COUNT DESC, COLUMN_NAME;
高级用法:
LISTAGG函数将所有包含该字段的表名合并成一个字符串- 可以调整0.8这个阈值来查找不同普及度的公共字段
- 结果可以导出作为数据字典的一部分
我曾经用这个查询发现了一个命名不一致但实际含义相同的字段,后来统一了命名规范,大大简化了报表系统的代码。
5. 实用技巧与优化建议
5.1 查询性能优化
这些元数据查询虽然方便,但在大型数据库上可能会比较慢。以下是我的优化经验:
- 添加适当索引:在ALL_TABLES.OWNER和ALL_TABLES.TABLE_NAME上创建索引
- 使用物化视图:对常用查询创建定期刷新的物化视图
- 限制查询范围:尽量通过OWNER和TABLE_NAME条件缩小查询范围
- 避免高峰期执行:这些查询会给系统表带来压力,建议在低峰期运行
5.2 安全注意事项
- 权限控制:只授予必要用户查询系统视图的权限
- 敏感信息保护:某些系统视图可能包含敏感信息,查询结果要妥善保管
- 避免锁冲突:查询系统视图时尽量避免长时间持有锁
5.3 扩展应用场景
这些基础查询可以扩展应用到以下场景:
- 数据治理:分析表的命名规范遵循情况
- 容量规划:跟踪表空间增长趋势
- 影响分析:评估表结构变更的影响范围
- 元数据管理:构建自定义的数据字典
我在实际工作中经常将这些查询封装成脚本或存储过程,加入一些自动化逻辑,比如:
- 自动识别并告警异常增长的表
- 定期检查未使用的表
- 监控表结构变更
- 生成数据血缘关系报告
达梦数据库的系统视图非常丰富,除了本文介绍的几个常用视图外,还有ALL_INDEXES、ALL_CONSTRAINTS、ALL_TRIGGERS等视图可以帮助我们全面了解数据库结构。掌握这些查询技巧可以极大提高DBA的工作效率。