啊宇哥哥 2025-12-21 23:00 采纳率: 98.5%
浏览 0
已采纳

达梦统计信息存于哪张系统表?

达梦数据库的统计信息主要存储在系统表 `SYSSTAT` 和 `SYSCOLUMNSTAT` 中。其中,`SYSSTAT` 记录表级别的统计信息,如行数、数据块数量等;`SYSCOLUMNSTAT` 则存储列级统计信息,包括列基数、空值数、直方图信息等。这些统计信息由执行 `ANALYZE` 或自动收集任务生成,用于优化器进行执行计划选择。一个常见问题是:为何执行 `ANALYZE TABLE` 后查询执行计划未更新?可能原因即为统计信息未正确写入或未被优化器及时加载。因此,确认统计信息是否已成功持久化至上述系统表,是性能调优和问题排查的关键步骤。
  • 写回答

1条回答 默认 最新

  • 舜祎魂 2025-12-21 23:01
    关注

    1. 统计信息在达梦数据库中的核心作用

    在达梦数据库(DM Database)中,查询优化器依赖统计信息来生成高效的执行计划。这些统计信息主要存储于两个关键系统表中:SYSSTATSYSCOLUMNSTAT

    • SYSSTAT:记录表级别的元数据,如总行数(NUM_ROWS)、使用的数据块数量(BLK_CNT)、平均行长度等。
    • SYSCOLUMNSTAT:保存列级别的详细统计,包括唯一值数量(基数,DISTCNT)、空值数量(NULLCNT)、数据分布直方图(Histogram)等。

    这些信息通过执行 ANALYZE TABLE ... COMPUTE STATISTICS 或由自动统计信息收集任务定期更新,直接影响 CBO(基于成本的优化器)对访问路径、连接顺序和索引选择的判断。

    2. 执行 ANALYZE 后执行计划未更新?常见现象与初步排查

    一个典型的性能调优场景是:DBA 执行了 ANALYZE TABLE t_test COMPUTE STATISTICS;,但随后的 SQL 执行计划并未发生预期变化。这往往引发疑问:“统计信息是否真的已写入?”

    此时应从以下角度进行分析:

    1. 确认 ANALYZE 命令是否成功执行且无报错。
    2. 检查当前用户是否有权限访问 SYSSTATSYSCOLUMNSTAT 系统表。
    3. 验证目标表的对象 ID 是否能在系统表中找到对应记录。
    4. 查看数据库参数 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 工具迁移时,确保统计信息同步导出导入,防止新环境性能劣化。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月22日
  • 创建了问题 12月21日