注册
查看执行计划的几种方式
专栏/技术分享/ 文章详情 /

查看执行计划的几种方式

小懵懂 2023/09/19 2396 6 0
摘要

一、 执行计划解释
执行计划的每行即为一个计划节点,主要包含三部分信息。

  • 第一部分 NEST2、PRJT2、CSCN2 为操作符及数据库具体执行了什么操作。
  • 第二部分的三元组为该计划节点的执行代价,具体含义为[代价,记录行数,字节数]。
  • 第三部分为操作符的补充信息。

二、查看执行计划的方式

  1. 通过 DM 数据库配套管理工具查看
    select a.EMPLOYEE_NAME,
    b.DEPARTMENT_NAME
    from DMHR.EMPLOYEE a ,
    DMHR.DEPARTMENT b
    where a.DEPARTMENT_ID = b.DEPARTMENT_ID
    and b.DEPARTMENT_ID = 102;

方式一.png

  1. 使用 explain 命令查看
    方式二.png

  2. ET系统函数查看
    ET函数统计对应执行ID的所有操作符的执行时间。
    使用ET函数需设置INI参数 ENABLE_MONITOR=1、MONITOR_TIME=1和MONITOR_SQL_EXEC=1

--两个参数均为动态参数,可直接调用系统函数进行修改
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);

--关闭
ET SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',0);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',0);
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',0);

--查看参数值
select name, type, value from v$parameter t where name in('ENABLE_MONITOR','MONITOR_SQL_EXEC','MONITOR_TIME');

--通过ET工具查看执行计划中的所有操作符的执行时间
--通过disql命令查看
SQL> select a.EMPLOYEE_NAME,
b.DEPARTMENT_NAME
from DMHR.EMPLOYEE a ,
DMHR.DEPARTMENT b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
and b.DEPARTMENT_ID = 102;2 3 4 5 6

LINEID EMPLOYEE_NAME DEPARTMENT_NAME


1 马学铭 行政部
2 程擎武 行政部
3 王金玉 行政部
4 林炳森 行政部
5 周魏 行政部
6 程东生 行政部

6 rows got

1 #NSET2: [1, 21->6, 104]
2 #PRJT2: [1, 21->6, 104]; exp_num(2), is_atom(FALSE)
3 #NEST LOOP INNER JOIN2: [1, 21->6, 104];
4 #BLKUP2: [1, 1->1, 52]; INDEX33555614(DEPARTMENT)
5 #SSEK2: [1, 1->1, 52]; scan_type(ASC), INDEX33555614(DEPARTMENT), scan_range[102,102]
6 #SLCT2: [1, 21->6, 52]; A.DEPARTMENT_ID = 102
7 #CSCN2: [1, 856->856, 52]; INDEX33555616(EMPLOYEE)

ps: 21是统计信息中记录的条数, 6 是 真实记录的条数。

used time: 1.876(ms). Execute id is 5785018.
SQL> ET(5785018);

LINEID OP TIME(US) PERCENT RANK SEQ N_ENTER MEM_USED(KB) DISK_USED(KB) HASH_USED_CELLS HASH_CONFLICT DHASH3_USED_CELLS DHASH3_CONFLICT


1 PRJT2 2 0.21% 8 2 4 0 0 0 0 NULL NULL
2 DLCK 9 0.94% 7 0 2 0 0 0 0 NULL NULL
3 NLI2 25 2.62% 6 3 6 0 0 0 0 NULL NULL
4 SLCT2 49 5.14% 5 6 6 0 0 0 0 NULL NULL
5 NSET2 70 7.35% 4 1 3 0 0 0 0 NULL NULL
6 BLKUP2 111 11.65% 3 4 4 0 0 0 0 NULL NULL
7 SSEK2 297 31.16% 2 5 2 0 0 0 0 NULL NULL
8 CSCN2 390 40.92% 1 7 4 0 0 0 0 NULL NULL

8 rows got

--通过dm manager 工具查看
方式三.png

  1. 根据trace打印执行计划
    SQL> set autotrace trace
    SQL> select a.EMPLOYEE_NAME,
    b.DEPARTMENT_NAME
    from DMHR.EMPLOYEE a ,
    DMHR.DEPARTMENT b
    where a.DEPARTMENT_ID = b.DEPARTMENT_ID
    and b.DEPARTMENT_ID = 102;

LINEID EMPLOYEE_NAME DEPARTMENT_NAME


1 马学铭 行政部
2 程擎武 行政部
3 王金玉 行政部
4 林炳森 行政部
5 周魏 行政部
6 程东生 行政部

6 rows got

1 #NSET2: [1, 6->6, 104]
2 #PRJT2: [1, 6->6, 104]; exp_num(2), is_atom(FALSE)
3 #NEST LOOP INNER JOIN2: [1, 6->6, 104];
4 #BLKUP2: [1, 1->1, 52]; INDEX33555614(DEPARTMENT)
5 #SSEK2: [1, 1->1, 52]; scan_type(ASC), INDEX33555614(DEPARTMENT), scan_range[102,102]
6 #BLKUP2: [1, 6->6, 52]; IDX$$_3(EMPLOYEE)
7 #SSEK2: [1, 6->6, 52]; scan_type(ASC), IDX$$_3(EMPLOYEE), scan_range[102,102]

used time: 5.258(ms). Execute id is 5785001.

  1. v$cachepln中获取执行计划
    --通过v$cachepln视图查询SQL的执行计划的cache_item
    SQL> SELECT sqlstr,cache_item from v$cachepln where sqlstr like '%UPDATE T_CORP_ACCINFO%';
    SQLSTR CACHE_ITEM
    UPDATE T_CORP_ACCINFO AS B SET B.DWFCRS = (B.DWFCRS + :<1>),B.GRJCJS = (B.GRJCJS + :<2>),B.DWJCRS = (B.DWJCRS + :<3>),B.DWYJCE = (B.DWYJCE + :<4>),B.DWZHYE = (B.DWZHYE + :<5>),B.ZONGRS = (B.ZONGRS + :<6>),B.IUD_TYP = :<9>,B.LAST_UPDATE_TIME = SYSDATE WHERE (B.DWKHH = :<7> AND B.DWZH = :<8> ) 281222182045816

--通过dump命令可以把需要的计划给导出来
SQL> alter session set events 'immediate trace name plndump level 281222182045816 , dump_file ''/home/dmdba/update_281222182045816.log''';

--到目录下就可以看到test.log文件中dump出来的执行计划
SQL> host cat /home/dmdba/update_281222182045816.log
DM Database Server x64 V8

*** 2023-04-20 14:39:46.693000000*** start dump the infos of pln[281222182045816].
start dump the infos of pln[281222182045816].
SQL_STR:
UPDATE T_CORP_ACCINFO AS B SET B.DWFCRS = (B.DWFCRS + :<1>),B.GRJCJS = (B.GRJCJS + :<2>),B.DWJCRS = (B.DWJCRS + :<3>),B.DWYJCE = (B.DWYJCE + :<4>),B.DWZHYE = (B.DWZHYE + :<5>),B.ZONGRS = (B.ZONGRS + :<6>),B.IUD_TYP = :<9>,B.LAST_UPDATE_TIME = SYSDATE WHERE (B.DWKHH = :<7> AND B.DWZH = :<8> )
PLN_CMD:
0 savepoint
6 dop_try_begin 0
10 dop_try_begin 1
14 nop
16 dop_try_begin 2
20 dop_try_begin 3
24 sql 0 0
34 nop
36 jmp 71
42 nop
44 push 0
50 swap
52 sloc 1
56 bp_err_set 0
60 jmp 71
66 nop
68 throw dir 1
71 exception end
73 jmp_lpa 14
79 nop
81 jmp 122
87 nop
89 push 1
95 swap
97 sloc 1
101 err_set 1
105 rollback
111 jmp 122
117 nop
119 throw dir 1
122 exception end
124 savepoint
130 cop 'a'
134 hlt 0

sqlnode[0]::::
1 #UPDATE : [0, 0, 0]; table(T_CORP_ACCINFO), type(select)
2 #PRJT2: [1, 1->1, 288]; exp_num(9), is_atom(FALSE)
3 #SLCT2: [1, 1->1, 288]; B.DWKHH = exp_param(no:6)
4 #BLKUP2: [1, 1->1, 288]; INDEX33564978(T_CORP_ACCINFO)
5 #SSEK2: [1, 1->1, 288]; scan_type(ASC), INDEX33564978(T_CORP_ACCINFO), scan_range[exp_param(no:7),exp_param(no:7)]
end dump the infos of pln[281222182045816].

  1. dbms_sqltune系统包查看
    系统包介绍:
    当SQL监控功能开启后,DBMS_SQLTUNE包可以实时监控SQL执行过程中的信息,包括:执行时间、执行代价、执行用户、统计信息等情况。使用DBMS_SQLTUNE也需要将DM.INI参数ENABLE_MONITOR、MONITOR_TIME、MONITOR_SQL_EXEC设置为1。

--需要先设置参数为开启状态
--两个参数均为动态参数,可直接调用系统函数进行修改
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);

--查看实际执行计划信息
SQL> set long 100000
SQL> select a.EMPLOYEE_NAME,
b.DEPARTMENT_NAME
from DMHR.EMPLOYEE a ,
DMHR.DEPARTMENT b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
and b.DEPARTMENT_ID = 102;2 3 4 5 6

LINEID EMPLOYEE_NAME DEPARTMENT_NAME


1 马学铭 行政部
2 程擎武 行政部
3 王金玉 行政部
4 林炳森 行政部
5 周魏 行政部
6 程东生 行政部

6 rows got

used time: 10.276(ms). Execute id is 6309100.

--根据执行id 查看执行计划
SQL> select DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=>6309100);

LINEID DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=>6309100)


1 SQL Monitoring Report

SQL Text

select a.EMPLOYEE_NAME,
b.DEPARTMENT_NAME
from DMHR.EMPLOYEE a ,
DMHR.DEPARTMENT b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
and b.DEPARTMENT_ID = 102;

Global Information

Status : DONE (ALL ROWS)
Session : SYSDBA (140055834757864:63057)
SQL ID : 18925
SQL Execution ID : 6309100
Execution Started : 2023-04-13 09:44:19
Duration : 0.000976s
Program : disql

方式六1.png

--根据sql id 查看执行计划
SQL> select DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_ID=>18925);

LINEID DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_ID=>18925)


1 SQL Monitoring Report

SQL Text

select a.EMPLOYEE_NAME,
b.DEPARTMENT_NAME
from DMHR.EMPLOYEE a ,
DMHR.DEPARTMENT b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
and b.DEPARTMENT_ID = 102;

Global Information

Status : DONE (ALL ROWS)
Session : SYSDBA (140055834757864:63057)
SQL ID : 18925
SQL Execution ID : 6309100
Execution Started : 2023-04-13 09:44:19
Duration : 0.000976s
Program : disql

方式六.png

三、结论
以上几种方式都可以查看执行计划,但是某些方式需要开启参数,可根据实际情况选择查看执行计划的方式。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服