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中,如果某些操作没有真正执行或者执行时间耗时非常短,则不会在结果中显示。