1 ET 工具说明
在之前的博客,我们介绍了达梦的执行计划,如下:
DM7 达梦数据库 查询优化 — 执行计划 查看
https://www.cndba.cn/dave/article/3630
在执行计划中我们知道里面有很多不同的操作符:
- CSCN :基础全表扫描(a),从头到尾,全部扫描
- SSCN :二级索引扫描(b), 从头到尾,全部扫描
- SSEK :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值
- CSEK :聚簇索引范围扫描(c) ,通过键值精准定位到范围或者单值
- BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)
- SLCT:过滤条件,是对结果集进行过滤,需要注意的是操作符的描述信息,从描述信息中可以看到对于下层操作有哪些可用的过滤条件,这些条件往往是优化方向的来源。
- SORT: SORT是做排序操作时使用到的操作符。
- HAGR:HASH AGR操作,是最基础的分组方式,对于没有优化条件的分组语句,一般都会按这种方式进行分组,分组原理和HASH INNER JOIN 的方式类似,将原表数据取出,每个计算FOLD,发现有FOLD相同,且满足后续条件的合并为一组。
- SAGR: SORTED AGR操作,不同于HASH AGR,由于下层数据有序,同一分组的数据按照顺序取出就行,节省了大量的计算。
如果只看这些操作符,我们只能判断这些操作符使用是否正确,但不能知道每个操作符执行的时间。
而ET 工具,就是这个补充,ET 工具用来统计执行 ID 为 ID_IN 的所有操作符的执行时间。对于分析优化SQL提供比较直观的数据依据。在达梦 SQL 手册
里对ET 有说明。
如果某些操作符并没有真正执行或者耗时很短,则不会在 ET 中显示。另外, 结果中出现了 EXPLAIN 计划中没有的 DLCK 操作符,它是用来对字典对象的上锁处理,通常情况下可以忽略。
2 ET 使用示例
2.1 启用ET
默认情况下,不启用ET功能,启用ET 需要设置如下3个参数:
ENABLE_MONITOR=1、MONITOR_TIME=1 和 MONITOR_SQL_EXEC=1。
SQL> select para_name,para_value,para_type from v$dm_ini where para_name in ('ENABLE_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 0 SESSION
已用时间: 5.097(毫秒). 执行号:500.
SQL>
我们在之前的博客,介绍了达梦查看和修改参数的方法如下:
DM7 达梦数据库 参数 修改方法
https://www.cndba.cn/dave/article/3578
通过刚才的查询,可以知道默认情况下,ENABLE_MONITOR和MONITOR_TIME 就是1,所以我们只需要设置 MONITOR_SQL_EXEC 参数即可,并且该参数还是个动态参数,修改不需要重启实例。
SQL> SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);
DMSQL 过程已成功完成
已用时间: 3.646(毫秒). 执行号:501.
SQL> select para_name,para_value,para_type from v$dm_ini where para_name in ('ENABLE_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
已用时间: 4.101(毫秒). 执行号:502.
SQL>
关闭该参数:
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',0);
2.2 使用ET
在上节我们已经启用了ET,我们这里看ET的使用。
查看执行计划:
SQL> explain SELECT T1.NAME, T2.NAME FROM PRODUCTION.PRODUCT_CATEGORY T1 LEFT OUTER JOIN PRODUCTION.PRODUCT_SUBCATEGORY T2 ON T1.PRODUCT_CATEGORYID = T2.PRODUCT_CATEGORYID;
1 #NSET2: [1, 40, 52]
2 #PRJT2: [1, 40, 52]; exp_num(2), is_atom(FALSE)
3 #HASH LEFT JOIN2: [1, 40, 52]; key_num(1), partition_keys_num(0), ret_null(0), mix(0) KEY(T1.PRODUCT_CATEGORYID=T2.PRODUCT_CATEGORYID)
4 #CSCN2: [1, 7, 52]; INDEX33555489(PRODUCT_CATEGORY as T1)
5 #CSCN2: [1, 40, 52]; INDEX33555491(PRODUCT_SUBCATEGORY as T2)
已用时间: 1.007(毫秒). 执行号:0.
SQL>
SQL> SELECT T1.NAME, T2.NAME FROM PRODUCTION.PRODUCT_CATEGORY T1 LEFT OUTER JOIN PRODUCTION.PRODUCT_SUBCATEGORY T2 ON T1.PRODUCT_CATEGORYID = T2.PRODUCT_CATEGORYID;
行号 NAME NAME
---------- ------ ------------------
1 小说 世界名著
……
39 少儿 少儿英语
40 金融 NULL
40 rows got
已用时间: 2.738(毫秒). 执行号:503.
SQL>
在使用et之前,必须先执行一次SQL,拿到执行号:503。
然后调用et:
SQL> et(503);
行号 OP TIME(US) PERCENT RANK SEQ N_ENTER HASH_USED_CELLS HASH_CONFLICT
---------- ----- -------------------- ------- -------------------- ----------- ----------- -------------------- --------------------
1 PRJT2 3 0.15% 6 2 6 0 0
2 DLCK 4 0.20% 5 0 2 0 0
3 CSCN2 12 0.60% 4 5 2 0 0
4 CSCN2 30 1.51% 3 4 2 0 0
5 NSET2 76 3.83% 2 1 4 0 0
6 HLO2 1860 93.70% 1 3 7 7 0
6 rows got
已用时间: 17.711(毫秒). 执行号:504.
SQL>
ET结果中每一行对应一个操作符,每一列对应的解释如下:
- OP : 操作符名称
- TIME(US) : 执行耗时,以微秒为单位
- PERCENT RANK : 在整个计划中用时占比
- SEQ : 计划中的序号
- N_ENTER :操作符进入的次数
然后就可以与执行计划对应起来看了。
版权声明:本文为博主原创文章,未经博主允许不得转载。