执行计划是一条查询语句在数据库中的执行过程或访问路径的描述。查看执行计划有助于理解sql语句在执行的详细过程和细节。尤其是对慢sql语句来说,通过查看执行计划了解sql执行节点中的痛点,进行有针对性的排查,是后续改进sql性能的重要基础。
达梦数据库查看执行计划的主要有两种方式,一个是通过explain命令在disql/管理环境下使用sql语句查看,第二直接使用管理工具执行计划按钮查看。
通过explain命令使用sql语句查看
使用explain命令查看执行计划
示例: EXPLAIN SELECT * from SYS.DBA_OBJECTS where object_type='TABLE';
使用explain for命令查看执行计划
EXPLAIN FOR SELECT * from SYS.DBA_OBJECTS where object_type='TABLE';
可以看出EXPLAIN FOR 命令输出的执行计划更加详细;
使用EXPLAIN命令查看执行计划如果是特别大的SQL语句,在linux系统的disql环境下对于查看执行计划的阅读体验不太友好,可以复制出来放在windows下的文本编辑器如UE和notepad++进行查看或者通过管理工具执行。
使用DM管理工具查看
打开manager管理工具,然后在查询窗口输入sql语句,点击查看执行计划按钮,查询窗口下方的窗口会显示改sql的执行计划,如下图所示:
执行计划中常见的操作符解释
常见的操作符有:
NESET: 结果集
PRJT:投影,用于选择表达式的计算
CSCN:基础全表扫描(a),从头到尾,全部扫描
SSCN:二级索引扫描(b),从头到尾,全部扫描
SSEK:二级索引范围扫描(b),通过键值精准定位到范围或者单值
CSEK:聚簇索引范围扫描(c),通过键值精准定位到范围或者单值
BLKUP:通过二级索引的ROWID回原表中取出全部数据(b+a)
SLCT:过滤条件,是对结果集进行过滤
SORT:SORT是做排序操作时使用到的操作符
HAGR:HASH AGR操作,是最基础的分组方式,对于没有优化条件的分组语句,一般都会按这种方式进行分组。
SAGR:SORTED AGR操作,同一分组的数据按照顺序取出。
NEST LOOP INNER JOIN (嵌套循环连接):最基础的连接方式,将一张表的一个值与另一张表所有值拼接,形成一个大结果集,再从大结果集中过滤出满足条件的行。
HASH JOIN (哈希连接):没有索引情况下,大多数连接的处理方式,将一张的连接列做成哈希表,另一张表的数据向这个哈希表匹配,满足条件返回。
INDEX JOIN(索引连接):将一张表的数据拿出,去另一张表上进行范围扫描找出需要的数据行,需要右表连接列上存在索引
MERGE JOIN (归并连接):两张表都扫描索引,按照索引顺序进行归并。
DM数据库中ET功能的使用
开启DM数据库的ET功能
达梦数据库的ET功能是默认未开启。启动ET需要设置三个参数:
ENABLE_MONITOR、MONITOR_TIME、MONITOR_SQL_EXEC;
开启ET功能命令:
SP_SET_PARA_VALUE(1,’ENABLE_MONITOR’,1);
SP_SET_PARA_VALUE(1,’MONITOR_TIME’,1);
SF_SET_SESSION_PARA_VALUE(‘MONITOR_SQL_EXEC’,1);
其中,ENABLE_MONITOR和MONITOR_TIME默认已开启。上述命令在未开启的情况下执行。
MONITOR_SQL_EXEC为会话级动态参数,可以设置只针对当前会话开启。
查看ET功能的输出
在查询窗口执行一条sql语句,可以在下方的信息栏,看到语句的Execute ID,鼠标直接点击,ET可以显示执行各个节点的执行时间;如图:
还可以在查询窗口调用存储过程
Call et(543);
返回结果以表的行列形式显示,如图: