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

达梦SQL优化利器-ET使用方法

原创 始于脚下 2021-07-02
2555

ET是达梦数据库内置的SQL性能优化分析工具,它可以统计指定会话ID执行的SQL的所有操作符的执行时间,对于分析优化SQL提供比较直观的数据依据,所以呢,对于达梦数据库SQL优化,ET的使用是必须要掌握的技能之一。

达梦数据库ET功能默认是关闭的,需设置 INI 参数ENABLE_MONITOR=1、 MONITOR_TIME=1 和 MONITOR_SQL_EXEC=1。达梦数据库参数配置方法可以参考https://www.modb.pro/db/65435

我们以实际操作演示ET开启配置方法及使用方法。

1、查询相关参数及其值

SQL> select para_name,para_value,para_type from v$dm_ini where para_name in ('EN

ABLE_MONITOR','MONITOR_TIME','MONITOR_SQL_EXEC');

 

行号       PARA_NAME        PARA_VALUE PARA_TYPE

---------- ---------------- ---------- ---------

1          ENABLE_MONITOR   0          SYS

2          MONITOR_TIME     0          SYS

3          MONITOR_SQL_EXEC 0          SESSION

 

已用时间: 2.745(毫秒). 执行号:14.

SQL>


可以看到,这几个参数都是可以动态修改的。

2、配置相关参数开启ET功能

SQL> SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);

DMSQL 过程已成功完成

已用时间: 12.966(毫秒). 执行号:15.

SQL> SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);

DMSQL 过程已成功完成

已用时间: 12.716(毫秒). 执行号:16.

SQL> SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);

DMSQL 过程已成功完成

已用时间: 13.399(毫秒). 执行号:17.

SQL> select para_name,para_value,para_type from v$dm_ini where para_name in ('EN

ABLE_MONITOR','MONITOR_TIME','MONITOR_SQL_EXEC');

 

行号       PARA_NAME        PARA_VALUE PARA_TYPE

---------- ---------------- ---------- ---------

1          ENABLE_MONITOR   1          SYS

2          MONITOR_TIME     1          SYS

3          MONITOR_SQL_EXEC 1          SESSION

 

已用时间: 3.204(毫秒). 执行号:18.

SQL>


可以看到,相关参数已经配置为必须的值,此时ET功能已经开启完成。如果关闭,调用以下过程关闭即可。

SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',0);

SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',0);

SP_SET_PARA_VALUE(1,'MONITOR_TIME',0);

3、使用ET分析执行SQL效率

ET的调用方法是比较简单的,语法定义为:ET(ID_IN INT),ID_IN指SQL语句的执行ID,如下执行SELECT D.* FROM DMHR.DEPARTMENT D, DMHR.EMPLOYEE E WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID LIMIT 10;语句的执行号为7,我们就可以通过ET(7)的方式调用ET来显示该条SQL各个操作的具体执行时间及所占总时间的比例,然后提出针对性的优化。

SQL> SELECT D.* FROM DMHR.DEPARTMENT D, DMHR.EMPLOYEE E WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID LIMIT 10;

 

行号       DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID  LOCATION_ID

---------- ------------- --------------- ----------- -----------

1          101           总经理办        1001        1

2          1105          技术支持部      11005       11

3          1105          技术支持部      11005       11

4          1105          技术支持部      11005       11

5          1105          技术支持部      11005       11

6          1105          技术支持部      11005       11

7          1105          技术支持部      11005       11

8          1105          技术支持部      11005       11

9          1105          技术支持部      11005       11

10         1105          技术支持部      11005       11

 

10 rows got

 

已用时间: 2.043(毫秒). 执行号:7.

行号       OP    TIME(US)             PERCENT RANK                 SEQ         N_ENTER

---------- ----- -------------------- ------- -------------------- ----------- -----------

1          PRJT2 4                    0.33%   7                    2           4

 

2          DLCK  10                   0.83%   6                    0           2

 

3          TOPN2 18                   1.49%   5                    3           3

 

行号       OP    TIME(US)             PERCENT RANK                 SEQ         N_ENTER

---------- ----- -------------------- ------- -------------------- ----------- -----------

4          CSCN2 22                   1.82%   4                    5           2

 

5          CSCN2 31                   2.57%   3                  6           1

 

6          NSET2 143                  11.85%  2                    1           3

 

行号       OP    TIME(US)             PERCENT RANK                 SEQ         N_ENTER

---------- ----- -------------------- ------- -------------------- ----------- -----------

7          HI3   979                  81.11%  1                    4           4

 

 

7 rows got

 

已用时间: 158.768(毫秒). 执行号:8.

SQL>


关于ET结果中,每个列的具体含义如下:

OP:操作符名称

TIME(US):执行耗时,以微秒为单位

PERCENT RANK:在整个计划中用时占比

SEQ:计划中的序号

N_ENTER:操作符进入的次数

当然了,也可以通过SQL语句直接来查询ID为7的SQL每个操作步骤具体执行的时间的,这样就不用配置开启ET功能。如下所示,我们使用SQL来查询以上SQL(ID为7,跟ET调用的ID一样的SQL)执行的每个操作花费的时间。

SQL> SELECT N.NAME, TIME_USED, N_ENTER FROM V$SQL_NODE_NAME N, V$SQL_NODE_HISTOR

Y H WHERE N.TYPE$ = H.TYPE$ AND EXEC_ID = 7;

 

行号       NAME  TIME_USED            N_ENTER

---------- ----- -------------------- -----------

1          NSET2 143                  3

2          PRJT2 4                    4

3          CSCN2 31                   1

4          CSCN2 22                   2

5          HI3   979                  4

6          TOPN2 18                   3

7          DLCK  10                   2

 

7 rows got

 

已用时间: 2.317(毫秒). 执行号:10.

SQL>


可以看到,得到的结果基本ET是一致的,只是显示的列值没有ET多而已。

4、使用达梦管理工具来使用ET

使用达梦管理工具调用ET就更简单了,如下所示,执行SQL。


在下半部分执行结果集旁边有个消息对话框,鼠标直接点击切换到消息对话框,会看到此次SQL的执行号为209,并且执行号为蓝色可点击的,直接鼠标点击209就可以弹出对应的ET结果。


需要注意的是,ET功能的开启是需要消耗一定的数据库性能的,如果系统整体性能比较繁忙,建议在使用ET完成SQL优化后,关闭ET功能。另外注意,在ET中,如果某些操作没有真正执行或者执行时间耗时非常短,则不会在结果中显示。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
D
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论