注册
SQL执行信息辅助工具 ET2
专栏/技术分享/ 文章详情 /

SQL执行信息辅助工具 ET2

Hanson.T 2025/05/23 310 3 4
摘要

在日常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,使用中可以根据自己的习惯选择。
image.png

ET2默认返回是表格结构,类似于
image.png
其中SQL_PLAN列内容中包括完整的执行计划表格、条件谓词信息、操作符说明和相关表统计信息状态。

也可以通过传递N_SRVOUT参数为 1 来改变输出方式为PRINT方式,在客户端工具的消息中显示,这样输出内容的可控性更好些。

不过,因为输出内容较多,可能会超过客户端工具设置的“显示的最大字符数”,所以建议预先手工修改下客户端工具配置:
image.png

输出效果如下图
image.png

上面已经给出了ET2的源码,使用时可以根据个人的喜好,修改过程头定义中的参数默认值为自己常用设置,省得每次都要手工传参,类似于:
image.png

个人感觉,ET2可控性和信息内容相对完善些,对SQL优化工作或能有些帮助。

目前已知问题的包括:

目前仅使用2021年10月份以后的版本做过初步测试验证,更早版本大概率因不支持某些系统视图或缺少某些字段而创建失败
对MPP、DSC等集群状态,尚未在程序中加以控制和区别,只能获取当前连接节点的信息
DPC部署模式尚在试验摸索过程中,可以先试用验证

由于个人技术水平有限,且手头测试环境很少,程序中不可避免存在各种缺陷和不足。希望大家能多多提出宝贵意见。

谢谢。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服