达梦 SQL 缓存(SQL 缓冲区,SCP)属于共享内存,核心作用:避免重复硬解析,重用 SQL 文本、执行计划,可选重用查询结果集,降低 CPU 解析开销,提升高并发 SQL 性能。
SQL 缓冲区内部逻辑划分为 3 个子池,都受 CACHE_POOL_SIZE 总大小控制:
SQL 语句池:存储 SQL 原始文本、哈希指纹,用于快速匹配 SQL;SQL 文本空格、大小写不同,哈希值不同,视为不同 SQL。
计划池(PLN 池):存放解析树、优化后执行计划,是最核心部分,对应参数 USE_PLN_POOL。
结果集池:缓存 SELECT 查询返回的数据行,默认关闭,RS_CAN_CACHE 控制开关。
完整 SQL 生命周期:词法分析 → 语法分析 → 语义校验 → 权限检查 → 优化器生成计划 → 执行 → 返回结果。
收到 SQL 语句,计算 SQL 文本哈希值,去SQL 语句池查找缓存条目。
缓存命中(软解析)
找到匹配 SQL 条目,取出缓存的执行计划;
如果开启结果集缓存,检查结果集是否有效,有效直接返回缓存结果;
结果集失效 / 未开启结果缓存:直接复用执行计划,访问数据缓冲区执行,返回数据。
缓存未命中(硬解析)
完整走词法、语法、语义、权限、优化器生成执行计划;
将 SQL 文本、执行计划写入 SQL 缓存;如果满足条件,写入结果集缓存;
执行计划返回结果给客户端。
缓存池内存满时,使用 LRU 算法 淘汰最近最少使用的缓存条目释放空间。
| 参数 | 默认值 | 说明 |
|---|---|---|
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,自动把字面量替换为参数,共用同一份执行计划,大幅减少缓存条目。
对依赖对象执行 DDL(alter table、create index、drop 等),该对象关联所有缓存计划全部失效;仅收集统计信息不会自动失效旧计划。
用户权限变更(revoke/grant),相关 SQL 缓存失效。
LRU 内存淘汰,长时间不访问自动清理。
手动调用存储过程清理
基表发生 INSERT/DELETE/UPDATE DML 修改,该表关联的结果集缓存立即失效;
表 DDL 变更;
LRU 内存淘汰。
https://eco.dameng.com
文章
阅读量
获赞
