达梦数据库的统计信息主要存储在系统表 `SYSSTAT` 和 `SYSCOLUMNSTAT` 中。其中,`SYSSTAT` 记录表级别的统计信息,如行数、数据块数量等;`SYSCOLUMNSTAT` 则存储列级统计信息,包括列基数、空值数、直方图信息等。这些统计信息由执行 `ANALYZE` 或自动收集任务生成,用于优化器进行执行计划选择。一个常见问题是:为何执行 `ANALYZE TABLE` 后查询执行计划未更新?可能原因即为统计信息未正确写入或未被优化器及时加载。因此,确认统计信息是否已成功持久化至上述系统表,是性能调优和问题排查的关键步骤。
1条回答 默认 最新
舜祎魂 2025-12-21 23:01关注1. 统计信息在达梦数据库中的核心作用
在达梦数据库(DM Database)中,查询优化器依赖统计信息来生成高效的执行计划。这些统计信息主要存储于两个关键系统表中:
SYSSTAT和SYSCOLUMNSTAT。- SYSSTAT:记录表级别的元数据,如总行数(
NUM_ROWS)、使用的数据块数量(BLK_CNT)、平均行长度等。 - SYSCOLUMNSTAT:保存列级别的详细统计,包括唯一值数量(基数,
DISTCNT)、空值数量(NULLCNT)、数据分布直方图(Histogram)等。
这些信息通过执行
ANALYZE TABLE ... COMPUTE STATISTICS或由自动统计信息收集任务定期更新,直接影响 CBO(基于成本的优化器)对访问路径、连接顺序和索引选择的判断。2. 执行 ANALYZE 后执行计划未更新?常见现象与初步排查
一个典型的性能调优场景是:DBA 执行了
ANALYZE TABLE t_test COMPUTE STATISTICS;,但随后的 SQL 执行计划并未发生预期变化。这往往引发疑问:“统计信息是否真的已写入?”此时应从以下角度进行分析:
- 确认
ANALYZE命令是否成功执行且无报错。 - 检查当前用户是否有权限访问
SYSSTAT和SYSCOLUMNSTAT系统表。 - 验证目标表的对象 ID 是否能在系统表中找到对应记录。
- 查看数据库参数
ENABLE_STATS是否启用(默认为 1)。
3. 深入验证统计信息是否持久化:SQL 查询示例
要确认统计信息是否已正确写入系统表,可通过如下 SQL 查询进行验证:
-- 查询表级统计信息 SELECT TABLE_NAME, NUM_ROWS, BLK_CNT, AVG_ROW_LEN, LAST_ANALYZED FROM SYS.SYSSTAT WHERE TABLE_NAME = 'T_TEST'; -- 查询列级统计信息 SELECT COLUMN_NAME, DISTCNT, NULLCNT, HISTOGRAM_TYPE FROM SYS.SYSCOLUMNSTAT WHERE TABLE_NAME = 'T_TEST';若查询结果为空或
LAST_ANALYZED时间戳未更新,则说明ANALYZE操作未成功持久化数据。4. 可能原因分析及解决方案对照表
问题现象 可能原因 诊断方法 解决方案 ANALYZE 执行无报错但无统计信息 未指定 COMPUTE 子句 检查语句完整性 使用完整语法: ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL COLUMNS统计信息存在但执行计划不变 优化器缓存未刷新 查询 V$CACHEPLAN 视图 清空 SQL 缓存: SP_FLUSH_PLAN_CACHE()SYSCOLUMNSTAT 中无直方图 未收集高频值分布 检查 HISTOGRAM_TYPE 字段 添加 SIZE 子句: FOR ALL COLUMNS SIZE 254自动任务未触发 统计信息自动收集被禁用 查询 DM_INI 参数 ENABLE_AUTO_STATS 设置 SP_SET_PARA_VALUE(1, 'ENABLE_AUTO_STATS', 1)跨模式对象无法识别 未指定 SCHEMA 名称 确认 OBJECT_NAME 全局唯一性 使用大写模式名明确指定: ANALYZE TABLE SCHEMA.TABNAME...5. 统计信息加载机制与优化器行为流程图
理解统计信息如何从持久化到被优化器使用的过程至关重要。以下是该过程的 Mermaid 流程图表示:
graph TD A[执行 ANALYZE TABLE] --> B{语法正确?} B -->|否| C[操作失败] B -->|是| D[扫描表数据并计算统计量] D --> E[写入 SYSSTAT 和 SYSCOLUMNSTAT] E --> F[标记 LAST_ANALYZED 时间戳] F --> G[优化器解析 SQL 时读取统计信息] G --> H{统计信息是否最新?} H -->|是| I[生成新执行计划] H -->|否| J[沿用旧计划或估算偏差] I --> K[执行高效查询]6. 高级调优建议与最佳实践
对于拥有五年以上经验的 DBA,需关注以下进阶点:
- 在大规模变更后(如批量导入、DELETE 清理),应立即手动收集统计信息,避免依赖自动任务延迟。
- 对倾斜数据列(Skewed Column)务必启用直方图(SIZE > 1),否则可能导致严重误判。
- 利用
DBMS_STATS包替代原始 ANALYZE,支持更细粒度控制,如锁定统计信息防止覆盖。 - 监控
V$SYSSTAT中“parse count”与“execute count”比例,辅助判断执行计划复用情况。 - 在生产环境中,建议开启统计信息历史保留功能,便于回滚至稳定版本。
- 结合
EXPLAIN PLAN FOR与实际运行计划对比,验证统计有效性。 - 注意分区表场景下,全局与局部统计信息的合并策略(INCREMENTAL=TRUE)。
- 避免频繁 ANALYZE 小表,可能引起闩锁争用。
- 定期审计
SYS.SYSSTAT.LAST_ANALYZED,建立统计信息健康度报表。 - 使用 DMCVT 工具迁移时,确保统计信息同步导出导入,防止新环境性能劣化。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- SYSSTAT:记录表级别的元数据,如总行数(