注册
达梦 DM SQL缓存(SQL Cache Pool)
专栏/技术分享/ 文章详情 /

达梦 DM SQL缓存(SQL Cache Pool)

肖庚 2026/08/28 165 1 0
摘要

达梦 SQL 缓存(SQL 缓冲区,SCP)属于共享内存,核心作用:避免重复硬解析,重用 SQL 文本、执行计划,可选重用查询结果集,降低 CPU 解析开销,提升高并发 SQL 性能。

一、内部三大子池

SQL 缓冲区内部逻辑划分为 3 个子池,都受 CACHE_POOL_SIZE 总大小控制:

  1. SQL 语句池:存储 SQL 原始文本、哈希指纹,用于快速匹配 SQL;SQL 文本空格、大小写不同,哈希值不同,视为不同 SQL。

  2. 计划池(PLN 池):存放解析树、优化后执行计划,是最核心部分,对应参数 USE_PLN_POOL

  3. 结果集池:缓存 SELECT 查询返回的数据行,默认关闭,RS_CAN_CACHE 控制开关。

二、SQL 完整执行流程(缓存命中 / 未命中)

完整 SQL 生命周期:词法分析 → 语法分析 → 语义校验 → 权限检查 → 优化器生成计划 → 执行 → 返回结果。

  1. 收到 SQL 语句,计算 SQL 文本哈希值,去SQL 语句池查找缓存条目。

  2. 缓存命中(软解析)

    • 找到匹配 SQL 条目,取出缓存的执行计划;

    • 如果开启结果集缓存,检查结果集是否有效,有效直接返回缓存结果;

    • 结果集失效 / 未开启结果缓存:直接复用执行计划,访问数据缓冲区执行,返回数据。

  3. 缓存未命中(硬解析)

    • 完整走词法、语法、语义、权限、优化器生成执行计划;

    • 将 SQL 文本、执行计划写入 SQL 缓存;如果满足条件,写入结果集缓存;

    • 执行计划返回结果给客户端。

  4. 缓存池内存满时,使用 LRU 算法 淘汰最近最少使用的缓存条目释放空间。

三、核心 dm.ini 参数说明

参数 默认值 说明
CACHE_POOL_SIZE 20(M) SQL 缓存总大小,单位 MB,建议业务量大调到 200‑1024M
USE_PLN_POOL 1 计划缓存开关 0:关闭,每次全部硬解析 1:启用计划重用 2:常量参数化(无绑定变量 SQL) 3:强制参数化(含字面量 SQL)
RS_CAN_CACHE 0 结果集缓存开关:0 关闭;1 强制缓存;2 HINT 手动控制
DYN_SQL_CAN_CACHE 1 是否缓存动态 SQL 的执行计划

参数化(USE_PLN_POOL=2/3):select * from t where id=1 / select * from t where id=2,自动把字面量替换为参数,共用同一份执行计划,大幅减少缓存条目。

四、缓存失效场景

1. 执行计划缓存失效

  1. 对依赖对象执行 DDL(alter table、create index、drop 等),该对象关联所有缓存计划全部失效;仅收集统计信息不会自动失效旧计划

  2. 用户权限变更(revoke/grant),相关 SQL 缓存失效。

  3. LRU 内存淘汰,长时间不访问自动清理。

  4. 手动调用存储过程清理

2. 结果集缓存失效

  • 基表发生 INSERT/DELETE/UPDATE DML 修改,该表关联的结果集缓存立即失效;

  • 表 DDL 变更;

  • LRU 内存淘汰。

https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服