1. 达梦SQL执行计划的核心价值与查看场景
在数据库性能优化的世界里,执行计划就像是SQL语句的"体检报告"。作为达梦数据库(DM)的使用者,我经常遇到这样的场景:一个原本运行良好的查询突然变慢,或者新上线的功能页面加载卡顿。这时候,执行计划就是我最先打开的"诊断工具包"。
执行计划本质上反映了达梦数据库优化器如何处理SQL语句的决策过程。它详细展示了:
- 数据访问路径(是全表扫描还是走索引)
- 多表连接的顺序和方式
- 排序、分组等操作的执行位置
- 每个步骤的估算代价和行数
在实际工作中,我发现执行计划分析主要应用于三大场景:
- 性能问题排查:当某个SQL执行时间从毫秒级骤增到秒级时,通过执行计划可以快速定位是索引失效、连接顺序不合理还是统计信息过时
- SQL优化验证:修改SQL或调整索引后,需要对比优化前后的执行计划变化,确认优化是否生效
- 开发阶段预防:在测试环境提前检查复杂SQL的执行计划,避免低效查询进入生产环境
经验分享:达梦的执行计划显示方式与Oracle高度相似,这对有Oracle经验的DBA是利好。但要注意达梦特有的操作符如CSCN2(聚集索引扫描)和SSEK2(二级索引扫描)的解读差异。
2. 基础方法:EXPLAIN预估执行计划详解
2.1 EXPLAIN命令的基本使用
作为最基础的执行计划查看方式,EXPLAIN不需要实际执行SQL就能返回优化器的预估方案。在达梦的disql命令行或管理工具中,只需在SQL前加上EXPLAIN关键字:
sql复制EXPLAIN
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_no = d.dept_no
WHERE e.salary > 10000;
典型输出示例(以文本格式展示):
code复制1 #NSET2: [1, 250, 156]
2 #PRJT2: [1, 250, 156]; exp_num(2), is_atom(FALSE)
3 #HASH JOIN: [1, 250, 156]; join condition(e.dept_no = d.dept_no)
4 #SLCT2: [1, 100, 78]; e.salary > 10000
5 #CSCN2: [1, 10000, 78]; INDEX33555457(EMPLOYEES)
6 #CSCN2: [1, 10, 78]; INDEX33555458(DEPARTMENTS)
2.2 执行计划的阅读技巧
达梦的执行计划采用树形结构展示,需要从最内层(缩进最多)向外解读:
- 第5行:对employees表进行全表扫描(CSCN2),估计扫描10000行
- 第4行:应用过滤条件salary > 10000,预计保留100行
- 第6行:对departments表全表扫描,估计10行
- 第3行:通过哈希连接(HASH JOIN)关联两个结果集
- 第2行:投影操作只保留name和dept_name两列
- 第1行:最终结果集返回给客户端
关键指标解读:
- 方括号中的三个数字分别表示[操作代价, 预估行数, 行长度]
- 操作代价是相对值,可用于比较不同步骤的开销
- 预估行数与实际行数的偏差常是性能问题的根源
2.3 图形化工具查看执行计划
达梦管理工具(DM Manager)提供了更直观的图形化展示:
- 在SQL编辑窗口输入查询语句
- 右键选择"解释计划"或点击工具栏的"执行计划"按钮
- 系统会显示树状图或表格形式的执行计划
图形化界面的优势在于:
- 用不同颜色标识高代价操作
- 支持点击节点查看详细信息
- 可直观看到各步骤的耗时占比
避坑指南:图形化工具展示的是预估计划而非实际执行数据。我曾遇到一个案例:图形界面显示使用了索引,但实际执行时由于统计信息不准,优化器在运行时切换为全表扫描。这种情况下需要结合ET获取真实数据。
3. 高级诊断:ET获取真实执行统计
3.1 ET功能的配置与启用
EXPLAIN只能提供优化器的"理论推测",而ET(Execution Trace)则能捕获SQL实际执行的详细数据。启用ET需要设置三个参数:
sql复制-- 全局参数(通常DBA已配置)
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1); -- 启用监控
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1); -- 收集时间统计
-- 会话级参数(需要时开启)
SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1); -- 启用SQL执行监控
执行SQL后,系统会返回一个执行编号:
code复制执行号:847
使用ET查看详细统计:
sql复制CALL ET(847);
3.2 ET报告的关键字段解析
典型的ET输出包含以下核心字段:
| 字段名 | 说明 | 优化关注点 |
|---|---|---|
| OP | 操作符类型 | 识别全表扫描、低效连接等 |
| TIME(us) | 该步骤耗时(微秒) | 定位性能热点 |
| PERCENT | 占总执行时间的百分比 | 识别主要瓶颈 |
| ROWS | 实际处理的行数 | 对比EXPLAIN的预估行数 |
| N_ENTER | 操作执行次数 | 识别循环内的重复操作 |
3.3 ET实战案例解析
假设我们发现一个分页查询变慢,ET报告显示:
code复制OP TIME(us) PERCENT ROWS N_ENTER
-----------------------------------------------
HASH JOIN 1200000 60% 5000 1
TABLE SCAN 800000 40% 10000 1
INDEX SCAN 400000 20%
