一、 执行计划解释
执行计划的每行即为一个计划节点,主要包含三部分信息。
二、查看执行计划的方式
使用 explain 命令查看
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 工具查看
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.
--通过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].
--需要先设置参数为开启状态
--两个参数均为动态参数,可直接调用系统函数进行修改
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
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;
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
--根据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
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;
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
三、结论
以上几种方式都可以查看执行计划,但是某些方式需要开启参数,可根据实际情况选择查看执行计划的方式。
文章
阅读量
获赞