执行计划是什么?
就是数据库执行这条 SQL 的“执行方案”:先扫哪张表、怎么连接、怎么过滤、怎么返回。
统计信息是优化器的输入,执行计划是优化器的输出。统计信息一变,计划就可能变。
首先,先分清要看“优化器预估的计划”,还是“SQL 真实跑出来的耗时”,再看“历史/缓存计划”。
| 想看的维度 | 用什么 | 特点 |
| 优化器预估的计划树 | EXPLAIN <SQL> | 最快,直接看执行形状 |
| 结构化代价、行数、索引建议 | EXPLAIN FOR / EXPLAIN AS | 逐操作符看 COST / 建议 |
| 真实执行耗时 | ET(执行号) | 找出最慢操作符 |
| 历史 / 缓存计划 | V$PLN_HISTORY、SP_FLUSH_HIST_PLAN | 复盘已经执行过的 SQL |
认识 5 个操作符:
CSCN2全表/聚簇索引扫描
SSEK2二级索引定位
BLKUP2索引找到后再回表取完整行
回表是什么?
只走二级索引还不够,还得回到表里把整行数据取出来
HASH JOIN一侧建哈希表,另一侧去匹配
NEST LOOP外层取一行,内层查一下
EXPLAIN 会真的执行 SQL 吗?
不会,它只让优化器生成计划,不会取数据。
查这两个监控开关到底开没开。VALUE是现在用的,SYS_VALUE是出厂默认,FILE_VALUE是写在配置文件里的。
FILE_VALUE 配置文件(dm.ini)里写的值,重启后会用这个;
V$PARAMETER 系统视图,存所有数据库参数的当前值;
SYSOBJECTS 达梦系统表,存了所有数据库对象(表、索引、存储过程等)的元数据;
SUBTYPE$ 子类型字段,'STAB'表示"系统表"(SYSTEM TABLE),用来过滤出系统自带的表。
EXPLAIN FOR SELECT NAME, ID FROM SYSOBJECTS WHERE SUBTYPE$='STAB';
SELECT NAME, ID FROM SYSOBJECTS WHERE SUBTYPE$='STAB';
ET(执行号);
CSCN2全表扫描占了82.5%的时间,SLCT2从2130行里过滤出53行,只花了0.06毫秒,NSET2打包53行结果返回,只花了0.06毫秒,PRJT2取两列数据。
CSCN2 这类全表扫描,确认它扫的是大表还是小表。NEST LOOP 适合“小驱动大 + 右表有索引”,大表之间常用 HASH JOIN。BLKUP2 说明二级索引需要回表,看回表次数多不多。Predicate Information 里的 access(...) 是索引定位条件,filter(...) 是拿到数据后再过滤,后者越早越好。ET 验证真实耗时。文章
阅读量
获赞
