
执行测试SQL
select b.department_id,b.department_name, count(*)from dmhr.EMPLOYEE ajoin dmhr.DEPARTMENT bon a.department_id = b.department_idand b.department_id = 102group by b.department_id,b.department_nameorder by b.department_id;
从SQL缓冲区获取执行计划地址
从SQL缓冲区v$cachepln中获取该SQL的执行计划地址(查询CACHE_ITEM列)。
SQL> select cache_item, sqlstr from SYS."V$CACHEPLN" t where t.SQLSTR like 'select b.department_id,b.department_name, count(*)%';行号CACHE_ITEM SQLSTR---------- --------------------------------------------------------------------1 139738210157456select b.department_id,b.department_name, count(*) from dmhr.EMPLOYEE a join dmhr.DEPARTMENT b on a.department_id = b.department_id and b.department_id = 102 group by b.department_id,b.department_name order by b.department_id;
获取实际执行计划
方法一:trace plndump
使用plndump 获取执行计划内容(注意新版本plndump trace不再支持指定操作系统路径,默认文件生产在trace目录下)
(1)dump执行计划:
SQL> alter session set events 'immediate trace name plndump level 139738210157456, dump_file ''sqlplntest.trc''';
(2)查看trace路径:
SQL> show parameter trace_path行号 PARA_NAME PARA_VALUE---------- ---------- ----------------------1 TRACE_PATH /dm8/data/DAMENG/trace
(3)查看trace文件内容:
[dmdba@localhost~]$ cat /dm8/data/DAMENG/trace/sqlplntest.trc

方法二:SF_TRACE_DUMP_PLN函数
SF_TRACE_DUMP_PLN函数是DM新版本才支持的功能,可以直接将对应CACHE_ITEM的执行计划内容返回到客户端。
定义:
TEXT SF_TRACE_DUMP_PLN ( PLN_ID bigint )
功能说明:
DUMP指定的执行计划。
参数说明:
PLN_ID:执行计划的地址。
返回值:
返回TEXT类型变量,存放缓存的执行计划信息。
执行如下SQL即可获取上述SQL的执行计划信息,内容显示如下:
SQL> set long 10000SQL> select SF_TRACE_DUMP_PLN(139738210157456);行号SF_TRACE_DUMP_PLN(139738210157456)---------- --------------------------------------------------------------------1*** 2025-04-25 14:03:52.677000000*** start dump the infos of pln[139738210157456].npln cache infos:scp cachetype: 0over flow: 0disable: 0fixed number: 2ts value: 10868type: 0hash val: 1786077120schid: 150994945user id: 50331649obj id: 0--rs cachers can cache: 0rs cache size: 0talbes' size: 2PLN_CREATE_TIME: 2025-04-25 14:01:53.000SQL_STR:select b.department_id,b.department_name, count(*)from dmhr.EMPLOYEE ajoin dmhr.DEPARTMENT bon a.department_id = b.department_idand b.department_id = 102group by b.department_id,b.department_nameorder by b.department_id;PLN_CMD:0 savepoint6 dop_try_begin 010 dop_try_begin 114 sql 0 024 nop26 jmp 6732 nop34 push 040 swap42 sloc 146 err_set 050 rollback56 jmp 6762 nop64 throw dir 167 exception end69 savepoint75 cop "b 0"80 hlt82 hltsqlnode[0]::::1 #NSET2: [1, 1, 56]2 #PRJT2: [1, 1, 56]; exp_num(3), is_atom(FALSE)3 #HAGR2: [1, 1, 56]; grp_num(1), sfun_num(1), MEM_USED(0KB), DISK_USED(0KB), distinct_flag[0]; slave_empty(0) keys(B.DEPARTMENT_NAME)4 #NEST LOOP INNER JOIN2: [1, 21, 56];5 #BLKUP2: [1, 1, 52]; INDEX33555480(DEPARTMENT)6 #SSEK2: [1, 1, 52]; scan_type(ASC), INDEX33555480(DEPARTMENT), is_global(0), scan_range[102,102]7 #SLCT2: [1, 21, 4]; A.DEPARTMENT_ID = 1028 #CSCN2: [1, 856, 4]; INDEX33555484(EMPLOYEE); btr_scan(1)end dump the infos of pln[139738210157456].
或直接使用DM管理工具或SQLlark直接执行该函数,获取执行计划,如下图所示:

SF_TRACE_DUMP_PLN函数是DM新版本才支持的功能,用于将对应执行计划信息输出到客户端显示,而plndump trace工具则是将执行计划信息写入到数据库服务端文件中(新版本默认在trace目录),相比较而言,SF_TRACE_DUMP_PLN函数对于运维人员使用更方便,另外,达梦还支持使用SF_TRACE_DUMP_PKGPLN函数从SQL缓冲区获取包的执行计划信息。
想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。在此邀请更多学员参与“达梦技术干货投稿活动”,稿件获选后将在达梦“干货分享”专栏进行发布,欢迎来稿!
【干货】SQL优化案例-索引的回表与过滤
【开班】达梦认证管理员DCA在线课程招生中【活动】达梦数据库迁移海南专场培训招生中

作者:青城




