达梦数据库查看SQL执行计划方法
本文主要记录达梦数据库查看SQL执行计划的方法,包括explain、autotrace、plndump、ET和查询数据字典方式。
概述
本文主要记录达梦数据库查看SQL执行计划的方法,包括explain、autotrace、plndump、et和查询数据字典方式。
explain方式
explain查看SQL执行计划分为两种形式explain和explain for,其中explain for显示的执行计划信息更加丰富,除了常规计划信息,还包括创建索引建议、 分区表的起止分区信息等,并且语句的计划保存在会话临时表"SYS"."##PLAN_TABLE" 中,方便用户随时查看,进行计划对比分析,临时表中的数据会随会话退出而一起清理。
执行方式为explain [AS PLAN_NAME FOR] +sql text,查看执行计划不实际执行语句。
explain样例:
explain select b.table_name,c.index_name,a.object_type
from test.testa a,test.testb b,test.testc c
where a.OBJECT_NAME=b.table_name and b.table_name=c.table_name
explain for样例:
explain as plantest1 for select b.table_name,c.index_name,a.object_type
from test.testa a,test.testb b,test.testc c
where a.OBJECT_NAME=b.table_name and b.table_name=c.table_name
explain for执行之后,可以通过##plan_table查看会话历史explain for的执行计划,比较不同执行计划的差异。
select *
from SYS."##PLAN_TABLE"
where plan_name in ('PLANTEST1','PLANTEST2')
order by plan_id,level_id;
autotrace方式
autotrace方式可以用于disql里面查看语句的真实执行消耗,包括语句的执行统计信息,例如执行时间,逻辑读和物理读,用法为SET AUTOTRACE <OFF(默认值) | NL | INDEX | ON|TRACE|TRACEONLY>、
其中NL用于查看执行计划里面是否包含nest loop,如果有就显示该部分的执行内容,不实际执行语句;INDEX|ON用于查看执行计划里面是否有包含INDEX操作,如果有就显示该部分内容,不实际执行语句;TRACE用于查看语句的实际执行消耗以及完整的执行计划,会实际执行语句;TRACEONLY跟TRACE类似,只不过不会显示语句的查询结果;OFF关闭执行计划显示。
AUTOTRACE ON样例:
AUTOTRACE TRACEONLY样例:
AUTOTRACE TRACE样例
plndump方式
plndump可以用于获取缓存v$cachepln里面的执行计划,适合用于查看已经执行或是正在执行语句执行计划(注:v$cachepln数量达到10000之后,会清理旧的sql缓存信息。)
查看方式:
需要根据SQL的表或是文本查询v$cachepln获取SQL缓存里面的地址cache_item
SELECT sqlstr,cache_item from v$cachepln where sqlstr like '%testa%'
再根据cache_time通过trace dump方式,生成执行计划的trc
注:
#13997912319490为cache item
#''为两个单引号,不是双引号
alter session set events 'immediate trace name plndump level 139979123194904,dump_file ''/tmp/sqlplan139979123194904.trc''';
注意:如果dump_file指定全路径报错Parent directory references exist第1 行附近出现错误[-6861]:存在父目录引用,则可以尝试只写生成的文件名后缀比较为.trc,并且不能指定目录,会生成在默认目录$SYSTEM_PATH/trace下,测试的时候在有些达梦版本指定路径会报错
et方式查看
ET分析工具,可以用于监控SQL语句执行每个操作符的时间和占比、操作符的调用次数、内存使用情况,可以比较直接的定位到性能问题的操作。
ET是默认关闭的,在使用ET之前,需要先通过参数ENABLE_MONITOR、MONITOR_SQL_
EXEC进行开启,其中ENABLE_MONITOR正常数据库都有开启,而MONITOR_SQL_EXEC在会话层开启就行,开启参数之后,执行语句会产生一个执行ID EXECID,通过调用et函数输入execid即可显示执行计划内容。
ET使用样例
disql V8
SQL> set lineshow off
SQL> set linesize 400
SQL> set pagesize 400
--执行语句前,会话开启MONITOR_SQL_EXEC
SQL> SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
DMSQL 过程已成功完成
已用时间: 0.364(毫秒). 执行号:23901.
--执行语句
SQL> select b.table_name,c.index_name,a.object_type
from test.testa a,test.testb b,test.testc c
where a.OBJECT_NAME=b.table_name and b.table_name=c.table_name
已用时间: 5.650(毫秒). 执行号:23902.
--语句执行之后会有一个执行号:23902,通过执行号调用ET,查看执行计划
et(23902);
建议在管理平台查看,显示格式会更整齐。
通过查询数据字典方式
当参数ENABLE_MONITOR=1 和MONITOR_SQL_EXEC=1时
v$sql_history:表记录SQL的历史记录信息;记录的SQL信息非实时的,正在执行的SQL无法在这个视图查到,只有语句结束之后才会进到这个表,常用字段:TIME_USED 执行时间,单位微妙,N_LOGIC_READ,N_PHY_READ,逻辑读和物理读次数,如果语句的执行时间较长,但是逻辑读和物理读显示为零,那有可能是语句没有正常执行完成,被强制取消。
V$SQL_NODE_HISTORY:会记录SQL执行节点信息,通过该表可以查询SQL执行节点信息,包括SQL节点的类型、进入次数和使用时间等等;
V$SQL_NODE_NAME:显示所有的SQL执行节点描述信息,包括SQL执行节点类型、名字和详细描述。
通过这3张表,可以查看已经执行语句的执行计划情况。
select a.exec_id,a.seq_no,c.TOP_SQL_TEXT,b.name,b.DESC_CONTENT,a.TIME_USED/1000.0/1000.0,a.N_ENTER,a.MEM_USED,a.DISK_USED
from V$SQL_NODE_HISTORY a,V$SQL_NODE_NAME b,v$sql_history c
where a.type$=b.type$ and a.EXEC_ID=c.EXEC_ID and c.TOP_SQL_TEXT like '%testsql%'
order by a.exec_id,a.seq_no;
更多推荐
所有评论(0)