注册
具体操作 | 我们已经知道有一个语句慢了,怎么处理?(行业黑话:看下ET和执行计划)

具体操作 | 我们已经知道有一个语句慢了,怎么处理?(行业黑话:看下ET和执行计划)

hql 2021/10/27 3139 14 1
摘要 达梦运维监控的手段非常多,在语句方面,也有一套行之有效的方法;调用的是一个内部函数ET,可以让我们知道一个执行计划中(也就是一个SQL语句的执行过程中,到底是哪里慢);可以有效的帮助我们跳过其他干扰部分,避免不必要的分析,快速处理、优化和解决问题。

ET就是做这么一个事情的。

首先,怎么查看执行计划

我们可以在sql前面加explian直接执行来查看执行计划,也可以通过下图的方式来查看执行计划。值得一提的是,我们一般用文本的方式查看,因为信息紧凑,也可以复制。

image.png

其次,怎么查看ET

ET就是准确告诉DBA,在这个语句的执行过程中,每一个操作符(对应的执行计划里面的每一行)具体耗时多少,这个是一个非常关键的信息

如果我们要查看ET,首先需要确认这两个参数是否打开,一般是打开的:

select * from v$dm_ini where para_name IN( 'ENABLE_MONITOR','MONITOR_TIME' )

这两个参数需要为1,且生产环境上,这两个参数也可以调整为1.

下面就是我们真正执行操作,去看ET的步骤了。

先设置好这个参数(仅对当前会话生效):

sf_set_session_para_value('MONITOR_SQL_EXEC',1);

注意:这个参数,在dm.ini也有这个配置;生产环境一般都要关闭(设置为0),即在需要使用的时候通过上述SQL,在会话级打开即可。

在执行了上述调整参数的窗口(注意,是同一个窗口里面),再执行我们需要分析的语句,获取完全部结果集(如果结果集很大,就取个limit)

然后,我们在消息窗口点击执行号,就可以看到我们每一个操作符的耗时时间了:
image.png

注意:在执行时间详情分析的界面中,我们重点关注 TIME(US)和 SEQ 两个列;第一列顾名思义,说的是这个步骤的耗时;第二个列,说的是这个操作符对应的是执行计划里面的哪一行(就是我们用文本方式查看执行计划时的行号) —— 这对应起来了。

话外音

1)有时候我们SQL再怎么复杂,通过这个方式,其实可以快速的定位是计划哪里的问题,在反过头去看SQL语法,是对应一个超复杂的SQL的哪部分需要优化。
2)当然,在一个复杂关联的SQL里面,如果因为某些原因,关联方式是失准的,可能会变得比较复杂。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服