暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货攻略】从SQL缓冲区获取执行计划

达梦E学 2025-05-06
204
引 言

达梦的SQL缓冲区用于缓存SQL语句、Package及对应的执行计划等,其中V$CACHEPLN动态视图记录SQL缓冲区中的执行计划信息,对于已经执行过的SQL,我们可以尝试直接从SQL缓冲区获取执行计划。本篇文章即介绍如何从SQL缓冲区获取对应SQL执行计划的功能。
本章内容已在如下环境上测试:
①数据库版本:达梦DM8(03134284399-20250418-270079-20151)
相关关键字:SQL缓冲区、执行计划。

——正文——

01

 执行测试SQL

执行测试SQL如下:
    select 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;

    02

     从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 139738210157456
      select 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;

      03

       获取实际执行计划

      方法一: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 10000
              SQL> 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 cache
              type: 0
              over flow: 0
              disable: 0
              fixed number: 2
              ts value: 10868
              type: 0
              hash val: 1786077120
              schid: 150994945
              user id: 50331649
              obj id: 0
              --rs cache
              rs can cache: 0
              rs cache size: 0
              talbes' size: 2
              PLN_CREATE_TIME: 2025-04-25 14:01:53.000


              SQL_STR:
              select 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;


              PLN_CMD:
              0       savepoint
              6       dop_try_begin   0
              10      dop_try_begin   1
              14      sql 0 0
              24      nop
              26      jmp     67
              32      nop
              34      push    0
              40      swap
              42      sloc    1
              46      err_set 0
              50      rollback
              56      jmp     67
              62      nop
              64      throw dir       1
              67      exception end
              69      savepoint
              75      cop "b 0"
              80      hlt
              82      hlt


              sqlnode[0]::::
              #NSET2: [1, 1, 56]
              #PRJT2: [1, 1, 56]; exp_num(3), is_atom(FALSE)
              #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)
              #NEST LOOP INNER JOIN2: [1, 21, 56];
              #BLKUP2: [1, 1, 52]; INDEX33555480(DEPARTMENT)
              #SSEK2: [1, 1, 52]; scan_type(ASC), INDEX33555480(DEPARTMENT), is_global(0), scan_range[102,102]
              #SLCT2: [1, 21, 4]; A.DEPARTMENT_ID = 102
              #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缓冲区获取包的执行计划信息。



              END


              想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。在此邀请更多学员参与“达梦技术干货投稿活动”,稿件获选后将在达梦“干货分享”专栏进行发布,欢迎来稿!


              往期回顾


              【干货】达梦数据库日志监控与分析(一)

              【干货】达梦数据库日志监控与分析(二)

              【干货】SQL优化案例-索引的回表与过滤

              【开班】达梦认证管理员DCA在线课程招生中

              【开班】达梦认证专家DCP在线课程招生中

              【活动】达梦数据库迁移海南专场培训招生中



              达梦E学
              达梦数据  学习园地

              作者:青城


              文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论