注册
执行计划
专栏/培训园地/ 文章详情 /

执行计划

🌊Amaharashi 2026/09/14 114 1 0
摘要

1 执行计划概念

执行计划是什么?
就是数据库执行这条 SQL 的“执行方案”:先扫哪张表、怎么连接、怎么过滤、怎么返回。
统计信息是优化器的输入,执行计划是优化器的输出。统计信息一变,计划就可能变。

2 查看执行计划

首先,先分清要看“优化器预估的计划”,还是“SQL 真实跑出来的耗时”,再看“历史/缓存计划”。
| 想看的维度 | 用什么 | 特点 |
| 优化器预估的计划树 | EXPLAIN <SQL> | 最快,直接看执行形状 |
| 结构化代价、行数、索引建议 | EXPLAIN FOR / EXPLAIN AS | 逐操作符看 COST / 建议 |
| 真实执行耗时 | ET(执行号) | 找出最慢操作符 |
| 历史 / 缓存计划 | V$PLN_HISTORYSP_FLUSH_HIST_PLAN | 复盘已经执行过的 SQL |
认识 5 个操作符:
CSCN2全表/聚簇索引扫描
SSEK2二级索引定位
BLKUP2索引找到后再回表取完整行

回表是什么?
只走二级索引还不够,还得回到表里把整行数据取出来
HASH JOIN一侧建哈希表,另一侧去匹配
NEST LOOP外层取一行,内层查一下

3 EXPLAIN —— 快速看计划树

EXPLAIN 会真的执行 SQL 吗?
不会,它只让优化器生成计划,不会取数据。
image.png
查这两个监控开关到底开没开。VALUE是现在用的,SYS_VALUE是出厂默认,FILE_VALUE是写在配置文件里的。
FILE_VALUE 配置文件(dm.ini)里写的值,重启后会用这个;
V$PARAMETER 系统视图,存所有数据库参数的当前值;
SYSOBJECTS 达梦系统表,存了所有数据库对象(表、索引、存储过程等)的元数据;
SUBTYPE$ 子类型字段,'STAB'表示"系统表"(SYSTEM TABLE),用来过滤出系统自带的表。
image.png

  1. CSCN2 → 全表扫SYSOBJECTS,2130行全部读出来
  2. SLCT2 → 边扫边过滤,只保留SUBTYPE$='STAB'的,剩53行
  3. PRJT2 → 从53行里只取NAME和ID两列
  4. NSET2 → 打包成结果集,返回

4 EXPLAIN FOR —— 结构化代价与建议

EXPLAIN FOR SELECT NAME, ID FROM SYSOBJECTS WHERE SUBTYPE$='STAB';
image.png

5 ET —— 看真实执行耗时

SELECT NAME, ID FROM SYSOBJECTS WHERE SUBTYPE$='STAB';
image.png
ET(执行号);
image.png
CSCN2全表扫描占了82.5%的时间,SLCT2从2130行里过滤出53行,只花了0.06毫秒,NSET2打包53行结果返回,只花了0.06毫秒,PRJT2取两列数据。

6 怎么读执行计划

  1. 从最底层开始:先找到 CSCN2 这类全表扫描,确认它扫的是大表还是小表。
  2. 看连接方式:NEST LOOP 适合“小驱动大 + 右表有索引”,大表之间常用 HASH JOIN
  3. 看回表:出现 BLKUP2 说明二级索引需要回表,看回表次数多不多。
  4. 看过滤:Predicate Information 里的 access(...) 是索引定位条件,filter(...) 是拿到数据后再过滤,后者越早越好。
  5. 最终不要只看预估,用 ET 验证真实耗时。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服