在日常SQL优化工作过程中,需要参考较多的信息,如执行计划文本、各执行节点统计信息、SQL执行时统计信息、绑定参数、相关库表的统计信息等等。
我之前在做SQL优化时,常用的工具是 autotrace 和 ET,以下为一个简单的应用例子
SQL> set serveroutput on
SQL> set autotrace trace
SQL>
SQL>
SQL> select * from dba_users where username = :1;
请输入参数1的值:SYSDBA
行号 USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE DEFAULT_TABLESPACE DEFAULT_INDEX_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE INITIAL_RSRC_CONSUMER_GROUP EXTERNAL_NAME
---------- -------- ----------- -------- -------------- --------- -------------------------- ------------------ ------------------------ -------------------- -------------------------- ------- --------------------------- -------------
PASSWORD_VERSIONS EDITIONS_ENABLED AUTHENTICATION_TYPE NOWDATE
----------------- ---------------- ------------------- -------------------
1 SYSDBA 50331649 NULL OPEN NULL 2025-04-12 11:32:56.073169 MAIN SYSTEM TEMP 2024-11-12 11:17:54.894058 NULL NULL NULL
0 Y NDCT_DB_AUTHENT 2025-04-12 10:37:20
1 #NSET2: [6, 1->1, 293]
2 #PRJT2: [6, 1->1, 293]; exp_num(17), is_atom(FALSE)
3 #PRJT2: [6, 1->1, 293]; exp_num(17), is_atom(FALSE)
4 #HASH2 INNER JOIN: [6, 1->1, 293]; KEY_NUM(2), MEM_USED(20096KB), DISK_USED(0KB) KEY(PWDCG.LOGINID=USR.ID AND OBJ.ID=USR.ID) KEY_NULL_EQU(0, 0)
5 #HASH2 INNER JOIN: [4, 1->1, 194]; KEY_NUM(1), MEM_USED(19584KB), DISK_USED(0KB) KEY(exp_cast(ITP.ID)=OBJ.INFO3 >> var7&var8) KEY_NULL_EQU(0)
6 #PRJT2: [1, 1->5, 52]; exp_num(2), is_atom(FALSE)
......
Statistics
-----------------------------------------------------------------
0 data pages changed
0 undo pages changed
14 logical reads
0 physical reads
0 redo size
1680 bytes sent to client
85 bytes received from client
2 roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
0 io wait time(ms)
0 exec time(ms)
已用时间: 0.869(毫秒). 执行号:7204.
SQL>
SQL>
SQL> et(7204);
行号 OP TIME(US) PERCENT RANK SEQ N_ENTER MEM_USED(KB) DISK_USED(KB) HASH_USED_CELLS HASH_CONFLICT DHASH3_USED_CELLS DHASH3_CONFLICT HASH_SAME_VALUE
---------- ----- -------------------- ------- -------------------- ----------- ----------- -------------------- -------------------- -------------------- -------------------- ----------------- --------------- --------------------
1 PRJT2 1 0.15% 22 14 6 0 0 0 0 NULL NULL 0
2 SLCT2 1 0.15% 22 10 4 0 0 0 0 NULL NULL 0
3 PRJT2 1 0.15% 22 6 4 0 0 0 0 NULL NULL 0
4 PRJT2 1 0.15% 22 21 4 0 0 0 0 NULL NULL 0
5 ACTRL 2 0.30% 19 13 6 0 0 0 0 NULL NULL 0
6 PRJT2 2 0.30% 19 2 4 0 0 0 0 NULL NULL 0
7 HI3 2 0.30% 19 11 4 0 0 0 0 NULL NULL 0
8 IJI2 3 0.46% 18 12 10 0 0 0 0 NULL NULL 0
9 DIST 4 0.61% 17 22 4 7 0 5 0 NULL NULL 0
10 CSCN2 5 0.76% 16 26 1 0 0 0 0 NULL NULL 0
11 HRO2 7 1.06% 14 24 5 0 0 0 0 NULL NULL 0
......
25 rows got
(注:为了节省字数,部分内容被省略,下同)
其中,autotrace能得到执行计划文本和执行时统计信息,通过ET能得到各执行节点统计信息。
不过我个人感觉这种展示格式并不算友好,缺少一个能将各类辅助信息组织、整合到一起的功能。尤其是ET,初接触时一头雾水,无从下手,需要一定的学习成本才能逐步掌握。
所以起了个自制改进版ET的念头。
先贴上ET2源码:
用于20211021及其后版本:ET2_DM8_after20211021_202505121306.sql
用于20221020及其后版本:ET2_DM8_after20221020_202505121307.sql
用于20231011及其后版本:ET2_DM8_after20231011_202505160955.sql
下面内容是ET2的完整输出效果:
SQL> et2(7204);
SQL Text:
---------
select * from dba_users where username = :1;
SQL Statistics:
---------------
STAT NAME VALUE
---------------------------------- --------------------------
exec_id 7204
sql_id 791
start_time 2025-04-12 10:37:20.244975
time used(ms) 0.773
---------------------------------- --------------------------
data pages changed 0
undo pages changed 0
logical reads 14
physical reads 0
redo size 0
bytes sent to client 1680
bytes received from client 85
roundtrips to/from client 2
sorts (memory) 0
sorts (disk) 0
rows processed 0
io wait time(ms) 0
exec time(ms) 0
---------------------------------- --------------------------
sql parse time(ms) 0
sql hard parse time(ms) 0
parse elapsed time(ms) 0
execution cpu time(ms) 0
full table scan times 4
hash join times 5
tmp tablespace logic read(page) 0
tmp tablespace physical read(page) 0
plan buffer size 514296
max memory used(kb) 11008
---------------------------------- --------------------------
curr_sch SYSDBA
appname disql
clnt_ip ::ffff:127.0.0.1
pln_addr 139617818224688
sqlcache_item 139617821193288
Bind Parameters:
----------------
+--+-------+------+
|ID|TYPE |VALUE |
+--+-------+------+
| 1|VARCHAR|SYSDBA|
+--+-------+------+
Plan Addr:00007EFB4E75A830
+----+---+---------------------------------------+----------------------+----+----+----+-----+-----+----+------+----+-----+----+
| LN |Odr| Operation | Name |Cost|Rows|Rows|Bytes|Execs|Time| Time |Time| Mem |Dsk |
| | | | | |Est |Act | | |(us)|Pct(%)|Rank|(KB) |(KB)|
+----+---+---------------------------------------+----------------------+----+----+----+-----+-----+----+------+----+-----+----+
| 1| 28|NSET2 | | 6| 1| 1| 301| 3| 183| 4.89%| 4| 0| 0|
| 2| 27| +-PRJT2 | | 6| 1| 1| 301| 4| 1| 0.03%| 20| 0| 0|
| 3| 26| +-PRJT2 | | 6| 1| 1| 301| 4| 90| 2.40%| 5| 0| 0|
|+ 4| 25| +-HASH2 INNER JOIN | | 6| 1| 1| 301| 6|2003|53.50%| 1|20096| 0|
|+ 5| 19| +-HASH2 INNER JOIN | | 4| 1| 1| 202| 6| 254| 6.78%| 3|19584| 0|
| 6| 3| | +-PRJT2 | | 1| 1| 5| 52| 4| 1| 0.03%| 20| 0| 0|
| 7| 2| | | +-DISTINCT | | 1| 1| 5| 52| 4| 17| 0.45%| 12| 6| 0|
| 8| 1| | | +-DSCN |V$TABLESPACE | 1| 5| 5| 52| 2| 38| 1.01%| 6| 0| 0|
| | | |(SYSINDEXV$TABLESPACE)| | | | | | | | | | |
|+ 9| 18| | +-HASH2 INNER JOIN | | 3| 1| 1| 150| 6| 971|25.93%| 2|19584| 0|
|* 10| 14| | +-SLCT2 | | 1| 1| | 98| 4| 1| 0.03%| 20| 0| 0|
|+ 11| 13| | | +-HASH2 INNER JOIN | | 1| 1| | 98| 4| 2| 0.05%| 19| 0| 0|
| 12| 11| | | +-NEST LOOP INDEX JOIN2| | 1| 1| 1| 98| 10| 6| 0.16%| 17| 0| 0|
| 13| 7| | | | +-ACTRL | | 1| 1| 4| 98| 6| 0| | | 0| 0|
| 14| 6| | | | | +-PRJT2 | | 1| 1| 4| 17| 6| 1| 0.03%| 20| 0| 0|
| 15| 5| | | | | +-SAGR2 | | 1| 1| 4| 17| 5| 10| 0.27%| 15| 0| 0|
| 16| 4| | | | | +-CSCN2 |SYSPWDCHGS | 1| 4| 4| 17| 2| 13| 0.35%| 13| 0| 0|
| | | |(SYSINDEXSPWDCHGS) | | | | | | | | | | |
| 17| 10| | | | +-BLKUP2 |SYSOBJECTS | 1| 1| 1| 52| 10| 24| 0.64%| 9| 0| 0|
| | | |(SYSINDEXIDSYSOBJECTS)| | | | | | | | | | |
。。。。。。。
Predicate Information (identified by operation id):
---------------------------------------------------
* 10 - filter : OBJ.NAME = exp_param(no:0)
* 18 - filter : OBJ.NAME = exp_param(no:0)
* 19 - access : [PWDCG.LOGINID,PWDCG.LOGINID]
* 27 - access : [SYSUSERPROFILES.PID,SYSUSERPROFILES.PID]
Join Conditions (identified by operation id):
---------------------------------------------
+ 4 - key cond: KEY(PWDCG.LOGINID=USR.ID AND OBJ.ID=USR.ID)
+ 5 - key cond: KEY(exp_cast(ITP.ID)
+ 9 - key cond: KEY(OBJ.INFO3&var9=exp_cast(TP.ID)
+ 11 - key cond: KEY(PWDCG.LOGINID=OBJ.ID)
+ 24 - key cond: KEY(SYSUSERPROFILES.UID=USR.ID)
Operator Descriptions:
----------------------
[NSET2]
结果集收集,一般是查询计划的顶层节点
[PRJT2]
关系的“投影”(project)运算,用于选择表达式项的计算
exp_num:映射列数
is_atom:是否要求单行数据
[HASH2 INNER JOIN]
HASH内连接
(UNIQUE_FLAG):该连接中左右表数据的唯一性策略。取值:LRKEY_UNIQUE:左右表数据分别根据各自KEY值唯一;LKEY_UNIQUE:左表数据根据KEY值唯一,右表则不唯一;RKEY_UNIQUE:右表数据根据KEY值唯一,左表则不唯一
key_num:等值连接条件数
join_condition:连接条件
KEY:等值连接条件
KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等
INFO_BITS:相关优化信息的标志位,6个标志位自低向高含义如下:bit0:是否在哈希连接左表为广播数据时共享0号工作节点的哈希表;bit1:是否使用UNIONALL优化;bit2:是否选择开始执行任务;bit3:是否进行链路发送优化;bit4:是否进行链路发送优化,且需要进行归并;bit5:用于指示当前ESEND发送的目标进行归并排序
。。。。。。。
Original SQL Plan:
------------------
1 #NSET2: [6, 1, 293]
2 #PRJT2: [6, 1, 293]; exp_num(17), is_atom(FALSE)
3 #PRJT2: [6, 1, 293]; exp_num(17), is_atom(FALSE)
4 #HASH2 INNER JOIN: [6, 1, 293]; KEY_NUM(2); KEY(PWDCG.LOGINID=USR.ID AND OBJ.ID=USR.ID) KEY_NULL_EQU(0, 0)
5 #HASH2 INNER JOIN: [4, 1, 194]; KEY_NUM(1); KEY(exp_cast(ITP.ID)=OBJ.INFO3 >> var7&var8) KEY_NULL_EQU(0)
6 #PRJT2: [1, 1, 52]; exp_num(2), is_atom(FALSE)
7 #DISTINCT: [1, 1, 52]
8 #DSCN: [1, 5, 52]; SYSINDEXV$TABLESPACE(V$TABLESPACE)
9 #HASH2 INNER JOIN: [3, 1, 142]; KEY_NUM(1); KEY(OBJ.INFO3&var9=exp_cast(TP.ID)) KEY_NULL_EQU(0)
10 #SLCT2: [1, 1, 90]; OBJ.NAME = exp_param(no:0)
11 #HASH2 INNER JOIN: [1, 1, 90]; RKEY_UNIQUE KEY_NUM(1); KEY(PWDCG.LOGINID=OBJ.ID) KEY_NULL_EQU(0)
。。。。。。。
Table Statistics Info:
----------------------
+-----------+---------------+----------+---------+-----------+---------+-------------------+
|SCHEMA_NAME|TABLE_NAME |TABLE_ROWS|STAT_ROWS|PARTITIONED|TEMPORARY|LAST_ANALYZED |
+-----------+---------------+----------+---------+-----------+---------+-------------------+
|SYS |SYSOBJECTS | 2084| | | | |
|SYS |SYSPWDCHGS | 9| | | | |
|SYS |SYSUSER$ | 4| 4| | |2025-04-10 13:14:35|
|SYS |SYSUSERPROFILES| 0| | | | |
+-----------+---------------+----------+---------+-----------+---------+-------------------+
DMSQL 过程已成功完成
其中包括以下几部分内容:
SQL文本
执行时统计信息
绑定参数信息
执行计划及各节点信息(补充一句,执行计划表格第二列‘Odr’的内容是各节点的操作顺序,类似于百灵的执行步骤)
谓词
连接条件
操作符说明
原始执行计划文本
相关表统计信息状态
实际使用时,这么多信息,会显得过于冗长,反倒会把需要关注的内容给掩盖在大量信息中,所以,ET2支持传入显示设置参数,由调用者自行控制输出格式、内容及顺序。
下面为ET2的参数说明:
CREATE OR REPLACE PROCEDURE ET2 (N_EXEC_ID BIGINT,N_SHOWSET VARCHAR2 := null,N_SRVOUT INT := null)
AS
/*
参数说明:
N_EXEC_ID BIGINT 待分析的EXEC_ID值:
N_SHOWSET VARCHAR2 PRINT模式下显示设置
N_SRVOUT INT 控制是否使用PRINT输出,默认为NULL,即自动判断,客户端为disql时使用PRINT方式,其他客户端返回查询结果集,可以显式指定该参数,1 为使用PRINT方式;0为使用结果集方式
N_SHOWSET规则:
该参数仅对PRINT模式输出有效,结果集输出方式时该参数无效
结果集输出方式时,默认使用 ARJDOT
可用参数范围:
Q SQL文本
S SQL执行统计信息
B SQL绑定变量参数信息,如未启用 ENABLE_MONITOR_BP 则该参数无效
A 宽版执行计划表格,包括执行计划的参数信息,较宽
P 窄版执行计划表格,不包括执行计划的参数信息,适合控制台输出
R 执行计划中谓词信息
J 执行计划中连接信息
D 执行计划操作符说明
O 原始执行计划文本
T 执行计划中引用到的库表对象统计信息
注意:执行计划表格,对于PRINT输出默认为P,对于结果集输出默认为A
参数设置方法:
可以通过参数控制各段信息的显示顺序和是否显示,默认顺序为:QSBPRJDOT
如果仅显示某些信息,则只设置对应的标识符即可,如:QP,即只显示SQL文本和窄版执行计划表格
可以通过参数控制隐藏某些信息的显示,如:
-P,即在默认顺序下,不显示窄版执行计划表格,改用宽版表格
-P-O-A-R-J-D,即在默认顺序下,隐藏:执行计划表格、原始计划文本、谓词和连接信息、操作符说明。等同于 QSBT
*/
比如,如果只关注执行计划文本和执行时统计信息,那么可以采用参数 OS:
SQL> et2(7204,'OS');
Original SQL Plan:
------------------
1 #NSET2: [6, 1, 293]
2 #PRJT2: [6, 1, 293]; exp_num(17), is_atom(FALSE)
3 #PRJT2: [6, 1, 293]; exp_num(17), is_atom(FALSE)
4 #HASH2 INNER JOIN: [6, 1, 293]; KEY_NUM(2); KEY(PWDCG.LOGINID=USR.ID AND OBJ.ID=USR.ID) KEY_NULL_EQU(0, 0)
5 #HASH2 INNER JOIN: [4, 1, 194]; KEY_NUM(1); KEY(exp_cast(ITP.ID)=OBJ.INFO3 >> var7&var8) KEY_NULL_EQU(0)
6 #PRJT2: [1, 1, 52]; exp_num(2), is_atom(FALSE)
7 #DISTINCT: [1, 1, 52]
8 #DSCN: [1, 5, 52]; SYSINDEXV$TABLESPACE(V$TABLESPACE)
9 #HASH2 INNER JOIN: [3, 1, 142]; KEY_NUM(1); KEY(OBJ.INFO3&var9=exp_cast(TP.ID)) KEY_NULL_EQU(0)
10 #SLCT2: [1, 1, 90]; OBJ.NAME = exp_param(no:0)
11 #HASH2 INNER JOIN: [1, 1, 90]; RKEY_UNIQUE KEY_NUM(1); KEY(PWDCG.LOGINID=OBJ.ID) KEY_NULL_EQU(0)
12 #NEST LOOP INDEX JOIN2: [1, 1, 90]
13 #ACTRL: [1, 1, 90]
14 #PRJT2: [1, 1, 17]; exp_num(2), is_atom(FALSE)
。。。。。。。
SQL Statistics:
---------------
STAT NAME VALUE
---------------------------------- --------------------------
exec_id 7204
sql_id 791
start_time 2025-04-12 10:37:20.244975
time used(ms) 0.773
---------------------------------- --------------------------
data pages changed 0
undo pages changed 0
logical reads 14
physical reads 0
redo size 0
bytes sent to client 1680
bytes received from client 85
roundtrips to/from client 2
sorts (memory) 0
sorts (disk) 0
rows processed 0
io wait time(ms) 0
exec time(ms) 0
---------------------------------- --------------------------
sql parse time(ms) 0
sql hard parse time(ms) 0
parse elapsed time(ms) 0
execution cpu time(ms) 0
full table scan times 4
hash join times 5
tmp tablespace logic read(page) 0
tmp tablespace physical read(page) 0
plan buffer size 514296
max memory used(kb) 11008
---------------------------------- --------------------------
curr_sch SYSDBA
appname disql
clnt_ip ::ffff:127.0.0.1
pln_addr 139617818224688
sqlcache_item 139617821193288
DMSQL 过程已成功完成
如果只想观察SQL执行计划各步骤信息和执行时统计信息,且使用的console能支持较宽的行宽,可以用 AS 参数:
SQL> et2(7204,'as');
Plan Addr:00007EFB4E75A830
+----+---+---------------------------------------+---------------+--------------------+----+----+----+-----+-----+----+------+----+-----+----+--------------------------------------------------------------------------+
| LN |Odr| Operation | Table Name | Index Name |Cost|Rows|Rows|Bytes|Execs|Time| Time |Time| Mem |Dsk | PARAMS |
| | | | | | |Est |Act | | |(us)|Pct(%)|Rank|(KB) |(KB)| |
+----+---+---------------------------------------+---------------+--------------------+----+----+----+-----+-----+----+------+----+-----+----+--------------------------------------------------------------------------+
| 1| 28|NSET2 | | | 6| 1| 1| 301| 3| 183| 4.89%| 4| 0| 0| |
| 2| 27| +-PRJT2 | | | 6| 1| 1| 301| 4| 1| 0.03%| 20| 0| 0|exp_num(17), is_atom(FALSE) |
| 3| 26| +-PRJT2 | | | 6| 1| 1| 301| 4| 90| 2.40%| 5| 0| 0|exp_num(17), is_atom(FALSE) |
|+ 4| 25| +-HASH2 INNER JOIN | | | 6| 1| 1| 301| 6|2003|53.50%| 1|20096| 0|KEY_NUM(2); KEY(PWDCG.LOGINID=USR.ID AND OBJ.ID=USR.ID) KEY_NULL_EQU(0, 0)|
|+ 5| 19| +-HASH2 INNER JOIN | | | 4| 1| 1| 202| 6| 254| 6.78%| 3|19584| 0|KEY_NUM(1); KEY(exp_cast(ITP.ID)=OBJ.INFO3 >> var7&var8) KEY_NULL_EQU(0) |
| 6| 3| | +-PRJT2 | | | 1| 1| 5| 52| 4| 1| 0.03%| 20| 0| 0|exp_num(2), is_atom(FALSE) |
| 7| 2| | | +-DISTINCT | | | 1| 1| 5| 52| 4| 17| 0.45%| 12| 6| 0| |
| 8| 1| | | +-DSCN |V$TABLESPACE |SYSINDEXV$TABLESPACE| 1| 5| 5| 52| 2| 38| 1.01%| 6| 0| 0|SYSINDEXV$TABLESPACE(V$TABLESPACE) |
|+ 9| 18| | +-HASH2 INNER JOIN | | | 3| 1| 1| 150| 6| 971|25.93%| 2|19584| 0|KEY_NUM(1); KEY(OBJ.INFO3&var9=exp_cast(TP.ID)) KEY_NULL_EQU(0) |
|* 10| 14| | +-SLCT2 | | | 1| 1| | 98| 4| 1| 0.03%| 20| 0| 0|OBJ.NAME = exp_param(no:0) |
|+ 11| 13| | | +-HASH2 INNER JOIN | | | 1| 1| | 98| 4| 2| 0.05%| 19| 0| 0|RKEY_UNIQUE KEY_NUM(1); KEY(PWDCG.LOGINID=OBJ.ID) KEY_NULL_EQU(0) |
| 12| 11| | | +-NEST LOOP INDEX JOIN2| | | 1| 1| 1| 98| 10| 6| 0.16%| 17| 0| 0| |
| 13| 7| | | | +-ACTRL | | | 1| 1| 4| 98| 6| 0| | | 0| 0| |
| 14| 6| | | | | +-PRJT2 | | | 1| 1| 4| 17| 6| 1| 0.03%| 20| 0| 0|exp_num(2), is_atom(FALSE) |
| 15| 5| | | | | +-SAGR2 | | | 1| 1| 4| 17| 5| 10| 0.27%| 15| 0| 0|slave_empty(0) keys(SYSPWDCHGS.LOGINID) |
| 16| 4| | | | | +-CSCN2 |SYSPWDCHGS |SYSINDEXSPWDCHGS | 1| 4| 4| 17| 2| 13| 0.35%| 13| 0| 0|SYSINDEXSPWDCHGS(SYSPWDCHGS); btr_scan(1) |
| 17| 10| | | | +-BLKUP2 |SYSOBJECTS |SYSINDEXIDSYSOBJECTS| 1| 1| 1| 52| 10| 24| 0.64%| 9| 0| 0|SYSINDEXIDSYSOBJECTS(OBJ) |
|* 18| 9| | | | +-SLCT2 | | | 1| 1| 1| 52| 13| 12| 0.32%| 14| 0| 0|OBJ.NAME = exp_param(no:0) |
。。。。。。。
SQL Statistics:
---------------
STAT NAME VALUE
---------------------------------- --------------------------
exec_id 7204
sql_id 791
start_time 2025-04-12 10:37:20.244975
time used(ms) 0.773
---------------------------------- --------------------------
data pages changed 0
undo pages changed 0
logical reads 14
physical reads 0
redo size 0
bytes sent to client 1680
bytes received from client 85
roundtrips to/from client 2
sorts (memory) 0
sorts (disk) 0
rows processed 0
io wait time(ms) 0
exec time(ms) 0
---------------------------------- --------------------------
sql parse time(ms) 0
sql hard parse time(ms) 0
parse elapsed time(ms) 0
execution cpu time(ms) 0
full table scan times 4
hash join times 5
tmp tablespace logic read(page) 0
tmp tablespace physical read(page) 0
plan buffer size 514296
max memory used(kb) 11008
---------------------------------- --------------------------
curr_sch SYSDBA
appname disql
clnt_ip ::ffff:127.0.0.1
pln_addr 139617818224688
sqlcache_item 139617821193288
DMSQL 过程已成功完成
如果关注内容是SQL文本、绑定变量和执行计划文本,可以使用 QBO 参数:
SQL> et2(7204,'qbo');
SQL Text:
---------
select * from dba_users where username = :1;
Bind Parameters:
----------------
+--+-------+------+
|ID|TYPE |VALUE |
+--+-------+------+
| 1|VARCHAR|SYSDBA|
+--+-------+------+
Original SQL Plan:
------------------
1 #NSET2: [6, 1, 293]
2 #PRJT2: [6, 1, 293]; exp_num(17), is_atom(FALSE)
3 #PRJT2: [6, 1, 293]; exp_num(17), is_atom(FALSE)
4 #HASH2 INNER JOIN: [6, 1, 293]; KEY_NUM(2); KEY(PWDCG.LOGINID=USR.ID AND OBJ.ID=USR.ID) KEY_NULL_EQU(0, 0)
5 #HASH2 INNER JOIN: [4, 1, 194]; KEY_NUM(1); KEY(exp_cast(ITP.ID)=OBJ.INFO3 >> var7&var8) KEY_NULL_EQU(0)
6 #PRJT2: [1, 1, 52]; exp_num(2), is_atom(FALSE)
7 #DISTINCT: [1, 1, 52]
8 #DSCN: [1, 5, 52]; SYSINDEXV$TABLESPACE(V$TABLESPACE)
9 #HASH2 INNER JOIN: [3, 1, 142]; KEY_NUM(1); KEY(OBJ.INFO3&var9=exp_cast(TP.ID)) KEY_NULL_EQU(0)
10 #SLCT2: [1, 1, 90]; OBJ.NAME = exp_param(no:0)
11 #HASH2 INNER JOIN: [1, 1, 90]; RKEY_UNIQUE KEY_NUM(1); KEY(PWDCG.LOGINID=OBJ.ID) KEY_NULL_EQU(0)
12 #NEST LOOP INDEX JOIN2: [1, 1, 90]
13 #ACTRL: [1, 1, 90]
14 #PRJT2: [1, 1, 17]; exp_num(2), is_atom(FALSE)
。。。。。。。
DMSQL 过程已成功完成
如果是在manager等图形化客户端工具中使用,需要先设置一下“文本字体”和“表格字体”,manager默认使用的是非等宽字体,显示出的表格会混乱,换用等宽字体可以解决这个问题。我常用的等宽字体是Consolas,使用中可以根据自己的习惯选择。
ET2默认返回是表格结构,类似于
其中SQL_PLAN列内容中包括完整的执行计划表格、条件谓词信息、操作符说明和相关表统计信息状态。
也可以通过传递N_SRVOUT参数为 1 来改变输出方式为PRINT方式,在客户端工具的消息中显示,这样输出内容的可控性更好些。
不过,因为输出内容较多,可能会超过客户端工具设置的“显示的最大字符数”,所以建议预先手工修改下客户端工具配置:
输出效果如下图
上面已经给出了ET2的源码,使用时可以根据个人的喜好,修改过程头定义中的参数默认值为自己常用设置,省得每次都要手工传参,类似于:
个人感觉,ET2可控性和信息内容相对完善些,对SQL优化工作或能有些帮助。
目前已知问题的包括:
目前仅使用2021年10月份以后的版本做过初步测试验证,更早版本大概率因不支持某些系统视图或缺少某些字段而创建失败
对MPP、DSC等集群状态,尚未在程序中加以控制和区别,只能获取当前连接节点的信息
DPC部署模式尚在试验摸索过程中,可以先试用验证
由于个人技术水平有限,且手头测试环境很少,程序中不可避免存在各种缺陷和不足。希望大家能多多提出宝贵意见。
谢谢。
文章
阅读量
获赞