当前位置: 首页 > news >正文

达梦数据库-学习-23-获取执行计划的N种方法

目录

 

一、环境信息

二、说点什么

三、测试数据生成

四、测试语句

五、获取执行计划方法

1、EXPLAIN

(1)样例

(2)优势

(3)劣势

2、ET

(1)开启参数

(2)样例

(3)字段含义

(4)优势

(5)劣势

3、AUTOTRACE

(1)开启参数

(2)样例

(3)参数含义

(4)优势

(5)劣势

4、PLNDUMP

(1)样例

(2)SP_CLEAR_PLAN_CACHE

(3)参数含义

(4)优势

(5)劣势

5、DBMS_SQLTUNE

(1)开启参数

(2)常规样例

(3)自动调优样例

(4)参数含义

(5)优势

(6)劣势

6、10053事件

(1)样例

(2)语法树

(3)参数说明

(4)优势

(5)劣势


 

一、环境信息

名称
CPU12th Gen Intel(R) Core(TM) i7-12700H
操作系统CentOS Linux release 7.9.2009 (Core)
内存4G
逻辑核数4
DM版本1          DM Database Server 64 V8
2          DB Version: 0x7000c
3          03134284194-20240703-234060-20108
4          Msg Version: 12
5          Gsu level(5) cnt: 0

二、说点什么

优化是我们DBA工作中重要的一环,那执行计划的获取就成了我们的必修课,开始吧,我们的实验之旅。

三、测试数据生成

DROP TABLE LZL.SUN;
DROP TABLE LZL.MOON;
CREATE TABLE LZL.SUN (A INT, B VARCHAR2(20));
INSERT INTO LZL.SUN SELECT LEVEL,'SUN'||LEVEL FROM DUAL CONNECT  BY LEVEL <= 10;
INSERT INTO LZL.SUN SELECT LEVEL,'MOON'||LEVEL FROM DUAL CONNECT  BY LEVEL <= 1000;
CREATE TABLE LZL.MOON (A INT, B VARCHAR2(20));
INSERT INTO LZL.MOON SELECT LEVEL,'SUN'||LEVEL FROM DUAL CONNECT  BY LEVEL <= 1;
INSERT INTO LZL.MOON SELECT LEVEL,'MOON'||LEVEL FROM DUAL CONNECT  BY LEVEL <= 10000;
COMMIT;CALL SYS.DBMS_STATS.GATHER_TABLE_STATS('LZL','SUN',NULL,100);
CALL SYS.DBMS_STATS.GATHER_TABLE_STATS('LZL','MOON',NULL,100);

四、测试语句

SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';行号     A           B    A           B    
---------- ----------- ---- ----------- -----
1          1           SUN1 1           SUN1
2          1           SUN1 1           MOON1已用时间: 1.689(毫秒). 执行号:9907.

五、获取执行计划方法

1、EXPLAIN

(1)样例

SQL> EXPLAIN SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';1   #NSET2: [2, 1, 104] 
2     #PRJT2: [2, 1, 104]; exp_num(4), is_atom(FALSE) 
3       #HASH2 INNER JOIN: [2, 1, 104];  KEY_NUM(1); KEY(S.A=M.A) KEY_NULL_EQU(0)
4         #SLCT2: [1, 1, 52]; S.B = 'SUN1'
5           #CSCN2: [1, 1010, 52]; INDEX33555473(SUN as S); btr_scan(1)
6         #CSCN2: [1, 10001, 52]; INDEX33555474(MOON as M); btr_scan(1)已用时间: 16.655(毫秒). 执行号:0.

(2)优势

1、不需要执行SQL,因为很多慢SQL执行时间使我们怀疑人生。

2、不需要修改参数,有的生产环境调整一个参数,需要评估风险。

(3)劣势

1、非真实的执行计划,其中返回行数和代价都不一定是准确的,需要我们收集统计信息。

2、ET

(1)开启参数

CALL SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
CALL SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
CALL SF_SET_SESSION_PARA_VALUE('MONITOR_TIME',1);

后面两个参数开会话级别即可。MONITOR_TIME参数新版本不允许修改,可以不动。

(2)样例

SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';行号     A           B    A           B    
---------- ----------- ---- ----------- -----
1          1           SUN1 1           SUN1
2          1           SUN1 1           MOON1已用时间: 1.689(毫秒). 执行号:9907.SQL> CALL ET(9907);行号     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 4                    0.32%   7                    2           4           0                    00                    0                    NULL              NULL            02          DLCK  6                    0.49%   6                    0           2           0                    00                    0                    NULL              NULL            03          SLCT2 24                   1.95%   5                    4           7           0                    00                    0                    NULL              NULL            0行号     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     -------------------- -------------------- ----------------- --------------- --------------------
4          CSCN2 102                  8.27%   4                    5           5           0                    00                    0                    NULL              NULL            05          NSET2 105                  8.52%   3                    1           3           0                    00                    0                    NULL              NULL            06          HI3   172                  13.95%  2                    3           39          19584                01                    0                    NULL              NULL            0行号     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     -------------------- -------------------- ----------------- --------------- --------------------
7          CSCN2 820                  66.50%  1                    6           35          0                    00                    0                    NULL              NULL            07 rows got已用时间: 48.333(毫秒). 执行号:9908.

(3)字段含义

字段描述
OP操作符名称。
TIME(US)实际耗时(微秒),反映该步骤的实际执行时间。
PERCENT执行时间占总时间百分比。
RANK执行时间的耗时排序。
SEQ执行计划的节点号。
N_ENTER进入次数。
MEM_USED(KB)操作符使用的内存空间,单位:KB
DISK_USED(KB)操作符使用的磁盘空间,单位:KB
HASH_USED_CELLS哈希表使用的槽数
HASH_CONFLICT哈希表存在冲突的记录数
DHASH3_USED_CELLS动态哈希表中使用的槽数
DHASH3_CONFLICT动态哈希表中的冲突情况
HASH_SAME_VALUE开启哈希相同值挂链优化时,记录哈希表中相同值的总数,唯一值不纳入计数。例如:哈希表中存在一个 0 和两个相同值链 1—1—1、3—3,此时 HASH_SAME_VALUE=5

(4)优势

1、可迅速定位耗时的操作符。

2、可以看到一些EXPLAIN看不到的参数信息,辅助我们更好定位性能问题点。

(5)劣势

1、需开启额外参数。

2、需SQL执行完成,如果有的SQL跑不出来结果,就不能用此方法。

3、AUTOTRACE

(1)开启参数

CALL SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
CALL SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
CALL SF_SET_SESSION_PARA_VALUE('MONITOR_TIME',1);-- 只生成实际的执行计划。
SQL> set autotrace traceonly;-- 生成实际的执行计划和返回结果。
SQL> set autotrace trace;

后面两个参数开会话级别即可。MONITOR_TIME参数新版本不允许修改,可以不动。

(2)样例

SQL> set autotrace traceonly;SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';1   #NSET2: [2, 1->2, 104] 
2     #PRJT2: [2, 1->2, 104]; exp_num(4), is_atom(FALSE) 
3       #HASH2 INNER JOIN: [2, 1->2, 104];  KEY_NUM(1), MEM_USED(19584KB), DISK_USED(0KB) KEY(S.A=M.A) KEY_NULL_EQU(0)
4         #SLCT2: [1, 1->1, 52]; S.B = 'SUN1'
5           #CSCN2: [1, 1010->1010, 52]; INDEX33555525(SUN); btr_scan(1)
6         #CSCN2: [1, 10001->10001, 52]; INDEX33555526(MOON); btr_scan(1)Statistics
-----------------------------------------------------------------0           data pages changed0           undo pages changed53          logical reads0           physical reads0           redo size349         bytes sent to client143         bytes received from client1           roundtrips to/from client0           sorts (memory)0           sorts (disk)0           rows processed0           io wait time(ms)7           exec time(ms)已用时间: 8.264(毫秒). 执行号:622.SQL> set autotrace trace;SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';行号     A           B    A           B    
---------- ----------- ---- ----------- -----
1          1           SUN1 1           SUN1
2          1           SUN1 1           MOON11   #NSET2: [2, 1->2, 104] 
2     #PRJT2: [2, 1->2, 104]; exp_num(4), is_atom(FALSE) 
3       #HASH2 INNER JOIN: [2, 1->2, 104];  KEY_NUM(1), MEM_USED(19584KB), DISK_USED(0KB) KEY(S.A=M.A) KEY_NULL_EQU(0)
4         #SLCT2: [1, 1->1, 52]; S.B = 'SUN1'
5           #CSCN2: [1, 1010->1010, 52]; INDEX33555525(SUN); btr_scan(1)
6         #CSCN2: [1, 10001->10001, 52]; INDEX33555526(MOON); btr_scan(1)Statistics
-----------------------------------------------------------------0           data pages changed0           undo pages changed53          logical reads0           physical reads0           redo size349         bytes sent to client143         bytes received from client1           roundtrips to/from client0           sorts (memory)0           sorts (disk)0           rows processed0           io wait time(ms)0           exec time(ms)已用时间: 1.652(毫秒). 执行号:624.

(3)参数含义

参数描述单位建议
data pages changedSQL 执行过程中修改的数据页数量(仅针对 DML 操作,如 `INSERT/UPDATE/DELETE`)。高频更新场景建议定期整理表空间碎片。
undo pages changed事务修改 UNDO 日志的页数,用于回滚或恢复数据一致性。长事务或大事务会导致 UNDO 页增长,需控制事务粒度。
logical reads从缓存(内存)中读取的数据页次数。次数高值可能表明缓存命中率低,需增大 BUFFER_POOLS 参数。  
检查索引是否合理,减少全表扫描。
physical reads从磁盘直接读取的数据页次数(未命中缓存)。次数高值需优化索引或预热缓存(如预加载高频表)。 
redo sizeSQL 执行生成的重做日志(REDO)大小。字节(Byte)大事务会导致 REDO 日志膨胀,建议拆分为小事务。  
REDO日志频繁切换时,可增大REDO日志。
bytes sent to client查询结果集从服务器发送到客户端的字节数。字节若值过大,使用分页查询(LIMIT/OFFSET)或仅查询必要字段。  
启用压缩传输。
bytes received from client客户端发送到服务器的请求数据量(如 SQL 文本、绑定变量值)。字节 
roundtrips to/from client客户端与服务器之间的网络交互次数。次数减少频繁短查询,合并为批量操作。  
使用连接池复用会话,降低建立连接开销。
sorts (memory)在内存中完成的排序操作次数。次数确保排序字段有索引(避免 ORDER BY 全表扫描)。  
调整SORT_BUF开头的参数提升内存排序效率。
sorts (disk)因内存不足溢出到磁盘的排序次数(单路/多路归并排序)。次数非零值需增大 TEMP_SIZE 参数。  
优化 SQL 减少排序(如去掉冗余 DISTINCT)。
rows processedSQL 实际处理的数据行数(如 `SELECT` 返回行数或 `DML` 影响行数)。 
io wait time(ms)SQL 执行过程中等待磁盘 I/O 的总时间。毫秒(ms)高值需检查存储性能(如 RAID 配置、SSD 升级)。  
减少随机 I/O(如索引碎片整理)。
exec time(ms)SQL 从开始到结束的总执行时间(含网络传输、I/O 等待等)。毫秒(ms)使用 `V$SQL_HISTORY` 分析历史执行耗时趋势。

(4)优势

1、可以看到一些EXPLAIN看不到的参数信息,辅助我们更好定位性能问题点。

(5)劣势

1、需开启额外参数。

2、需SQL执行完成,如果有的SQL跑不出来结果,就不能用此方法。

4、PLNDUMP

(1)样例

可获得该计划的详细信息,trc文件存放在数据文件目录的trace文件夹下。

SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';行号     A           B    A           B    
---------- ----------- ---- ----------- -----
1          1           SUN1 1           SUN1
2          1           SUN1 1           MOON1已用时间: 7.588(毫秒). 执行号:1001.SQL> SELECT CACHE_ITEM,SQLSTR FROM V$CACHEPLN WHERE SQLSTR LIKE '%SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A%';行号     CACHE_ITEM          
---------- --------------------SQLSTR                                                                                                                     ---------------------------------------------------------------------------------------------------------------------------
1          140075396266936SELECT CACHE_ITEM,SQLSTR FROM V$CACHEPLN  WHERE SQLSTR LIKE '%SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A%';2          140075396210168SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';已用时间: 4.761(毫秒). 执行号:1002.SQL> alter session set events 'immediate trace name plndump level 140075396210168 , dump_file ''/opt/Dm8/Data/DAMENG/trace/SUN.trc''';
操作已执行
已用时间: 5.796(毫秒). 执行号:1101.SQL> quit[dmdba@localhost ~]$ cat /opt/Dm8/Data/DAMENG/trace/SUN.trc
DM Database Server x64 V8*** 2025-05-16 10:39:32.410000000*** start dump the infos of pln[140075396210168].npln cache infos:scp cachetype: 0over flow: 0disable: 0fixed number: 1ts value: 1856type: 0hash val: -873397353schid: 150994945user id: 50331649obj id: 0--rs cachers can cache: 0rs cache size: 0talbes' size: 2
PLN_CREATE_TIME: 2025-05-16 10:20:12.000SQL_STR:
SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';PLN_CMD:0       savepoint 6       dop_try_begin   010      dop_try_begin   114      sql 0 024      nop26      jmp     6732      nop34      push    040      swap42      sloc    146      err_set 050      rollback56      jmp     6762      nop64      throw dir       167      exception end69      savepoint 75      cop "b 0"80      hlt82      hltsqlnode[0]::::
1   #NSET2: [2, 1, 104] 
2     #PRJT2: [2, 1, 104]; exp_num(4), is_atom(FALSE) 
3       #HASH2 INNER JOIN: [2, 1, 104];  KEY_NUM(1), MEM_USED(0KB), DISK_USED(0KB) KEY(S.A=M.A) KEY_NULL_EQU(0)
4         #SLCT2: [1, 1, 52]; S.B = 'SUN1'
5           #CSCN2: [1, 1010, 52]; INDEX33555592(SUN); btr_scan(1)
6         #CSCN2: [1, 10001, 52]; INDEX33555593(MOON); btr_scan(1)end dump the infos of pln[140075396210168].

如果我们想清理老的执行计划,可以使用如下方法:

SQL> SP_CLEAR_PLAN_CACHE(140075396210168);
DMSQL 过程已成功完成
已用时间: 3.519(毫秒). 执行号:4306.SQL> SELECT CACHE_ITEM,SQLSTR FROM V$CACHEPLN 
WHERE SQLSTR LIKE '%SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A%';行号     CACHE_ITEM          
---------- --------------------SQLSTR                                                                                                                       -----------------------------------------------------------------------------------------------------------------------------
1          140075423825880SELECT CACHE_ITEM,SQLSTR FROM V$CACHEPLN    WHERE SQLSTR LIKE '%SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A%';2          140075396266936SELECT CACHE_ITEM,SQLSTR FROM V$CACHEPLN  WHERE SQLSTR LIKE '%SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A%';已用时间: 0.660(毫秒). 执行号:4307.

(2)SP_CLEAR_PLAN_CACHE

函数声明函数说明参数说明
SP_CLEAR_PLAN_CACHE()清空当前站点的执行缓存信息。无。
SP_CLEAR_PLAN_CACHE(plan_id bigint)清空当前站点指定的执行缓存信息。plan_id:指定计划 ID,其值可以从动态视图 V$CACHEPLN 中的 CACHE_ITEM 列获得。

(3)参数含义

暂时不明,如果有知道的大佬,欢迎沟通。

PLN_CMD下面的算子看着像是汇编语言。

(4)优势

1、由于里面有些参数不了解,说不定对于深入的优化是有作用的,先占个沙发。

2、可以看到一些历史的SQL真实执行计划。

(5)劣势

1、需要执行完SQL。

2、计划是真实的,但里面的返回行数和一些内存使用都是估算的。

5、DBMS_SQLTUNE

(1)开启参数

CALL SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
CALL SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
CALL SF_SET_SESSION_PARA_VALUE('MONITOR_TIME',1);

后面两个参数开会话级别即可。MONITOR_TIME参数新版本不允许修改,可以不动。

(2)常规样例

SQL> SET LONG 999999SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';行号     A           B    A           B    
---------- ----------- ---- ----------- -----
1          1           SUN1 1           SUN1
2          1           SUN1 1           MOON1已用时间: 1.545(毫秒). 执行号:608.SQL> SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=>608);行号     DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=>608)                                                                               
---------- --------------------------------------------------------------------------------------------------------------------------------
1          SQL Monitoring ReportSQL Text
------------------------------
SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';Global Information
------------------------------Status                                 :  DONE (ALL ROWS)Session                                :  SYSDBA (178983048:6)SQL ID                                 :  12SQL Execution ID                       :  608Execution Started                      :  2025-05-19 08:59:02Duration                               :  0.001006sProgram                                :  disqlGlobal Stats
=========================================================
| Affected |  Bytes   | Bytes |  Physical  |  Logical   |
|   Rows   | Allocate | Free  | Read(page) | Read(page) |
=========================================================
|        0 |        0 |     0 |          0 |         53 |
=========================================================SQL Plan Monitoring Details
==================================================================================================================
| Id | Operation | Name |  Rows   | Cost |   Time    |   Start   | Execs |   Rows   | Activity | Activity Detail |
|    |           |      | (Estim) |      | Active(s) |  Active   |       | (Actual) |   (%)    |   (# samples)   |
==================================================================================================================
|  0 | DLCK      |      |         |      |  0.000002 | +0.000971 |     2 |          |     0.21 |                 |
|  1 | NSET2     |      |       1 |    2 |  0.000085 | +0.000891 |     3 |        2 |     9.08 |                 |
|  2 | PRJT2     |      |       1 |    2 |  0.000003 | +0.000890 |     4 |        2 |     0.32 |                 |
|  3 | HI3       |      |       1 |    2 |  0.000113 | +0.000883 |    39 |        2 |    12.07 |                 |
|  4 | SLCT2     |      |       1 |    1 |  0.000014 | +0.000119 |     7 |        1 |     1.50 |                 |
|  5 | CSCN2     | SUN  |    1010 |    1 |  0.000052 | +0.000119 |     5 |     1010 |     5.56 |                 |
|  6 | CSCN2     | MOON |   10001 |    1 |  0.000667 | +0.000882 |    35 |    10001 |    71.26 |                 |
==================================================================================================================已用时间: 3.621(毫秒). 执行号:609.

(3)自动调优样例

创建调优任务

DBMS_SQLTUNE.CREATE_TUNING_TASK(
'SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = ''SUN1''',
TASK_NAME=>'SUN');

执行调优任务

DBMS_SQLTUNE.EXECUTE_TUNING_TASK('SUN');

生成调优报告

SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('SUN');行号     DBMS_SQLTUNE.REPORT_TUNING_TASK('SUN')                                                                                          
---------- --------------------------------------------------------------------------------------------------------------------------------
1          GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
TUNING TASK NAME    : SUN
TUNING TASK OWNER   : SYSDBA
WORKLOAD TYPE       : SINGLE SQL STATEMENT
EXECUTION COUNT     : 1
CURRENT EXECUTION   : SYSEXECNAME_1
EXECUTION TYPE      : TUNE SQL
SCOPE               : COMPREHENSIVE
TIME LIMIT(SECONDS) : 1800
COMPLETION STATUS   : COMPLETED
STARTED AT          : 2025-05-19 10:41:04
COMPLETED AT        : 2025-05-19 10:41:04
SQL TEXT            : SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1'-------------------------------------------------------------------------------FINDING SECTION (1 FINDING)
-------------------------------------------------------------------------------1 - INDEX FINDING-----------------通过创建一个或多个索引可以改进此语句的执行计划。RECOMMENDATION--------------考虑运行创建推荐的索引。CREATE INDEX IDX$$TASK1_EXEC1_1 ON "LZL"."SUN"("A");CREATE INDEX IDX$$TASK1_EXEC1_2 ON "LZL"."SUN"("B");CREATE INDEX IDX$$TASK1_EXEC1_3 ON "LZL"."MOON"("A");CREATE INDEX IDX$$TASK1_EXEC1_4 ON "LZL"."MOON"("B");-------------------------------------------------------------------------------已用时间: 7.403(毫秒). 执行号:613.

关闭调优任务

DBMS_SQLTUNE.DROP_TUNING_TASK('SUN');

(4)参数含义

Global Information

参数名描述
StatusDONE (ALL ROWS):SQL执行已完成,且返回了所有结果集。
Session会话信息。
SQL IDSQL语句的唯一标识符,相同SQL文本的ID相同。
SQL Execution ID本次SQL执行的全局唯一编号,用于区分不同执行实例。
Execution StartedSQL开始执行的时间戳。
DurationSQL执行总耗时。
Program发起SQL执行的客户端程序。

Global Stats

参数名描述
Affected RowsSQL影响的行数。
Bytes Allocate执行过程中分配的内存字节数。
Bytes Free释放的内存字节数。
Physical Read物理读页数。
Logical Read逻辑读页数。

SQL Plan Monitoring Details

参数名描述
Id执行计划步骤编号(从0开始)。
Operation执行计划操作类型。
Name操作涉及的对象名(如索引、表名)。
Rows (Estim)优化器估算的返回行数。
Cost优化器估算的执行代价。
Time Active(s)该步骤实际消耗的时间(秒)。
Start Active步骤开始执行的时间(相对于SQL启动时间的偏移量)。
Execs该步骤被执行的次数。
Rows (Actual)实际返回的行数。
Activity (%)该步骤在总执行时间中的占比(高占比可能为性能瓶颈)。
Activity Detail等待事件详情(如锁、I/O等)。

(5)优势

1、可以看到等待事件,实际执行时间、返回真实行数、执行次数等,对优化有一定帮助。

2、可以看到一些历史的SQL真实执行计划。

(6)劣势

1、需要执行完SQL。

2、SQL Plan Monitoring Details没有缩进,看不出执行顺序。

6、10053事件

(1)样例

SQL> select PARA_NAME,PARA_VALUE from v$dm_ini where PARA_NAME like '%TRACE_PATH%';行号     PARA_NAME  PARA_VALUE                
---------- ---------- --------------------------
1          TRACE_PATH /opt/Dm8/Data/DAMENG/trace已用时间: 16.736(毫秒). 执行号:601.SQL> alter session set events '10053 trace name context forever,level 1';
操作已执行
已用时间: 3.513(毫秒). 执行号:602.SQL> SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';行号     A           B    A           B    
---------- ----------- ---- ----------- -----
1          1           SUN1 1           SUN1
2          1           SUN1 1           MOON1已用时间: 20.469(毫秒). 执行号:603.SQL> alter session set events '10053 trace name context off';
操作已执行
已用时间: 2.819(毫秒). 执行号:604.

TRC文件

[root@localhost ~]# ll /opt/Dm8/Data/DAMENG/trace/
总用量 16
-rw-r--r-- 1 dmdba dinstall 12583 5月  19 11:11 DMSERVER_0519_1111_139852590978136.trc[root@localhost ~]# cat /opt/Dm8/Data/DAMENG/trace/DMSERVER_0519_1111_139852590978136.trc 
DM Database Server x64 V8[03134284336-20250117-257733-20132], Jan 22 2025 09:16:16 built.*** 2025-05-19 11:11:27.876000000
*** Start trace 10053 event [level 1]
Current SQL Statement:
SELECT * FROM LZL.SUN S INNER JOIN LZL.MOON M ON S.A = M.A WHERE S.B = 'SUN1';*****************************
Parameters for this statement
*****************************
olap_flag                         = 2
mpp_flag                          = 0
enable_monitor                    = 1
max_opt_n_tables                  = 6
enable_hash_join                  = 1
enable_index_join                 = 1
enable_merge_join                 = 1
mpp_index_join_opt_flag           = 1
mpp_nli_opt_flag                  = 1
enable_in_value_list_opt          = 518
enhanced_bexp_trans_gen           = 3
batch_param_opt                   = 0
use_pln_pool                      = 1
parallel_degree                   = 1
global_page_size                  = 8192
global_extent_size                = 16
view_pullup_flag                  = 34
view_pullup_max_tab               = 7
refed_exists_opt_flag             = 1
hash_pll_opt_flag                 = 107
partial_join_evaluation_flag      = 1
motion_opt_flag                   = 0
dpc_opt_flag                      = 0
use_fk_remove_tables_flag         = 1
use_filter_joining_remove_table   = 1
use_hagr_flag                     = 0
outer_join_index_opt_flag         = 0
hagr_parallel_opt_flag            = 4
group_opt_flag                    = 60
from_opt_flag                     = 0
hagr_distinct_opt_flag            = 2
mpp_hash_lr_rate                  = 10
lpq_hash_lr_rate                  = 30
slct_opt_flag                     = 8575
slct_err_process_flag             = 0
like_opt_flag                     = 127
filter_push_down                  = 2
star_transformation_enable        = 0
max_opt_n_or_bexps                = 7
dist_in_subquery_opt              = 0
count_64bit                       = 1
use_htab                          = 1
sel_item_htab_flag                = 0
or_cvt_htab_flag                  = 1
op_subq_cvt_in_flag               = 1
enhanced_subq_merging             = 3
case_when_cvt_flag                = 9
or_nbexp_cvt_case_when_flag       = 0
nbexp_opt_flag                    = 7
nonconst_or_cvt_in_lst_flag       = 0
dblink_opt_flag                   = 509
outer_cvt_inner_pull_up_cond_flag = 11
opt_or_for_huge_table_flag        = 0
enable_rq_to_spl                  = 1
multi_in_cvt_exists               = 1
prjt_replace_npar                 = 1
subq_cvt_spl_flag                 = 13
enable_rq_to_inv                  = 0
subq_exp_cvt_flag                 = 193
use_refer_tab_only                = 0
max_phc_be_num                    = 512
refed_subq_cross_flag             = 1
order_by_nulls_flag               = 0
in_list_as_join_key               = 0
outer_join_flating_flag           = 1
top_order_opt_flag                = 5
top_order_estimate_card           = 300
place_group_by_flag               = 0
sfun_push_down_flag               = 1
single_htab_remove_flag           = 1
phf_ntts_opt                      = 1
use_ftts                          = 0
upd_del_opt                       = 2
mpp_dml_force_opt                 = 0
mpp_motion_sync                   = 200
use_mclct                         = 2
top_dis_hash_flag                 = 1
enable_rq_to_nonref_spl           = 1
optimizer_mode                    = 1
enable_index_filter               = 1
parallel_mode_common_degree       = 1
hash_cmp_opt_flag                 = 0
nonrefed_subquery_as_const        = 1
outer_opt_nlo_flag                = 0
use_index_skip_scan               = 0
distinct_use_index_skip           = 2
index_skip_scan_rate              = 0.002500
complex_view_merging              = 2
optimizer_dynamic_sampling        = 0
table_stat_flag                   = 0
speed_semi_join_plan              = 9
multi_hash_dis_opt                = 1
del_hp_opt_flag                   = 0
cnntb_opt_flag                    = 193
cte_opt_flag                      = 1
adaptive_npln_flag                = 3
optimizer_or_nbexp                = 29
npln_or_max_node                  = 20
optimizer_in_nbexp                = 1
multi_upd_opt_flag                = 1
multi_upd_max_col_num             = 128
optimizer_version                 = 70101
optimizer_max_perm                = 7200
enable_invisible_col              = 1
push_subq                         = 0
invocation_opt_flag               = 119
view_filter_merging               = 138
enable_partition_wise_opt         = 1
opt_mem_check                     = 0
optimizer_aggr_groupby_elim       = 1
enable_join_factorization         = 1
query_info_bits                   = 0x0
explain_show_factor               = 1
error_compatible_flag             = 0x0
hi_right_order_flag               = 0
enable_nest_loop_join_cache       = 0
enable_table_exp_ref_flag         = 1
opt_cvt_var_cost_factor           = 1
opt_max_adaptive_exec_times       = 1000
sql_safe_update_rows              = 0
sort_flag                         = 0
bexp_calc_st_flag                 = 128
spl_share_flag                    = 0
cpu_cost_factor                   = 9500
sel_rate_equ                      = 0.025000
base_mi_cpu                       = 1000000.000000
build_hash_base_cost              = 0
sel_rate_single                   = 0.050000
having_rate_factor                = 1
inter_rate_factor                 = 1
ret_null_rate_factor              = 100
nlij_amplify_factor               = 4
cpu_speed                         = 3145728
n_runs                            = 1
mem_bandwidth                     = 3145728
mem_intense_degree                = 0
base_scan_cpu                     = 140000.000000
base_seek_cpu                     = 140000.000000
base_lkup_cpu                     = 62000.000000
base_nlij_cpu                     = 16000.000000
base_hi_cpu                       = 2683000.000000
base_nl_cpu                       = 1000000.000000
base_flt_cpu                      = 140000.000000
scan_cpu                          = 330.000000
seek_cpu                          = 400.000000
lkup_cpu                          = 2500.000000
nlij_cpu                          = 200.000000
hi_cpu                            = 400.000000
hi_search_cpu                     = 200.000000
mi_cpu                            = 300.000000
nl_cpu                            = 200.000000
flt_cpu                           = 30.000000
join_st_opt_flag                  = 1
enable_adjust_nli_cost            = 1
enable_adjust_dist_cost           = 0
lpq_motion_factor                 = 58.000000
mpp_motion_factor                 = 100.000000
memory_pool                       = 500
huge_buffer                       = 80
buffer                            = 4000
keep                              = 8
recycle                           = 300
sort_buf_size                     = 20
hagr_hash_size                    = 100000
hj_buf_global_size                = 5000
hj_buf_size                       = 500
hj_blk_size                       = 2
hagr_buf_global_size              = 5000
hagr_buf_size                     = 500
hagr_blk_size                     = 2
mtab_mem_size                     = 8
mmt_size                          = 0
mmt_flag                          = 1
dict_buf_size                     = 50
mal_buf_size                      = 100
mal_vpool_size                    = 128
vm_stack_size                     = 256
vm_pool_size                      = 64
sess_pool_size                    = 64
max_os_memory                     = 100
worker_threads                    = 16
worker_cpu_percent                = 0
task_threads                      = 16
enhance_bind_peeking              = 0
sqc_gi_num_per_tab                = 2
dpc_sync_step                     = 16
dpc_sync_total                    = 0
xbox_dump_threshold               = 0
xbox_target_size                  = 1024*** Plan before optimized:project[0x7f31f804ea28] n_exp(4) nest loop join[0x7f31f804d668]  ((S.B = 'SUN1' AND S.A = M.A))base table[0x7f31f804dcc0] (S, FULL SEARCH) base table[0x7f31f804e318] (M, FULL SEARCH) *** cross join leaf rel pre-process start<<<<< selectivity estimate of table S >>>>>
*** stdesc 1: column = B, scan_type = EQU, key = ('SUN1')stat_info(1052,1,'C')= {#Valid = 'Y', #Type  = 'Freq', #Card  = 1010, #NDV   = 1010, #Nulls = 0, #LP    = 15, #LVLS  = 1, #CLUF  = 0, #NK    = 0, #NS    = 1010}---> st = 0.00099>>>>> total: 1010, estimate match rows: 1, st: 0.00099; -- st_other: 1.000, n_stdesc: 1---------------- single table access path probe for S ----------------
*** path 1: INDEX33555592 (FULL search), cost: 0.21536>>> best access path: INDEX33555592 (FULL search), cost: 0.21536---------------- single table access path probe for M ----------------
*** path 1: INDEX33555593 (FULL search), cost: 1.20021>>> best access path: INDEX33555593 (FULL search), cost: 1.20021*** cross join leaf rel pre-process complete*** cross join optimization start...---------------- [Join Order 1 of 2] ----------------
{ "S" }{ "M" }<<<<< inner join card estimate (not push down filter) >>>>>
*** stdesc 1: S.A = M.A  ---> st: 0.00010stat_info(1052,0,'C')= {#Valid = 'Y', #Type  = 'Freq', #Card  = 1010, #NDV   = 1000, #Nulls = 0, #LP    = 15, #LVLS  = 1, #CLUF  = 0, #NK    = 0, #NS    = 1010}stat_info(1053,0,'C')= {#Valid = 'Y', #Type  = 'Freq', #Card  = 10001, #NDV   = 10000, #Nulls = 0, #LP    = 47, #LVLS  = 1, #CLUF  = 0, #NK    = 0, #NS    = 10001}>>>>> l_card: 1, r_card: 10001, estimate join card: 1(X), st: 0.00010; --- st_left = 1.000, st_right = 1.000, st_other = 1.000, n_stdesc = 1---------------- single table access path probe for M ----------------
*** path 1: INDEX33555593 (FULL search), cost: 1.20021>>> best access path: INDEX33555593 (FULL search), cost: 1.20021---------------- inner join method probe (not push down filter) ----------------
*** nest loop inner join cost: 43.37547
*** index inner join is not available
*** hash  inner join cost: 2.96903
*** merge inner join is not available>>> current best plan(1, 1), cost: 2.96903 hash inner join[0x7f31d7435b28]  (cost: 2.96903, rows: 1)select[0x7f31d7436170]  (S.B = 'SUN1')(cost: 0.21536, rows: 1)base table[0x7f31d74367b8] (S, INDEX33555592, FULL SEARCH) (cost: 0.21536, rows: 1010)base table[0x7f31d7436e00] (M, INDEX33555593, FULL SEARCH) (cost: 1.20021, rows: 10001)---------------- [Join Order 2 of 2] ----------------
{ "M" }{ "S" }---------------- inner join method probe (push down filter) ----------------
*** nest loop inner join is not available
*** index inner join is not available
*** hash  inner join cost: 3.66938
*** merge inner join is not available---------------- single table access path probe for S ----------------
*** path 1: INDEX33555592 (FULL search), cost: 0.16122>>> best access path: INDEX33555592 (FULL search), cost: 0.16122---------------- inner join method probe (not push down filter) ----------------
*** nest loop inner join is not available
*** index inner join is not available
*** hash  inner join cost: 3.73043
*** merge inner join is not available>>> no better plan found*** BEST PLAN FOR THIS STATEMENT ***project[0x7f31f80a3f80] n_exp(4) (cost: 2.96903, rows: 1)hash inner join[0x7f31f80a4d18]  (cost: 2.96903, rows: 1)select[0x7f31f80a5710]  (S.B = 'SUN1')(cost: 0.21536, rows: 1)base table[0x7f31f80a63d8] (S, INDEX33555592, FULL SEARCH) (cost: 0.21536, rows: 1010)base table[0x7f31f80a6a30] (M, INDEX33555593, FULL SEARCH) (cost: 1.20021, rows: 10001)-------------------------- END --------------------------

(2)语法树

ALTER SESSION [<sess_id>] SET EVENTS '<event_defs>';
<sess_id>:: =0
<event_defs >:: =<event_def> {:<event_def>}
<event_def>:: = <event_name> TRACE <event_qualifiers>
<event_name>:: =IMMEDIATE |
:: =<错误码>|<内部事件号>
<内部事件号>:: =10001|10002|10003|10046|10053
<event_qualifiers>:: = NAME <trace_name >[trace_qualifiers]
<trace_name>::=CONTEXT|BLOCKDUMP|BUFFERS|VPOOLDUMP|HEAPDUMP|DCT_CACHE| SCP_CACHE| ERRORSTACK| REDOHDR| LOGHIST| PLNDUMP|TREEDUMP
<trace_qualifiers >::= <trace_qualifier> {, <trace_qualifier>}
<trace_qualifier>::=OFF|FOREVER|LEVEL <level_value>|DUMP_FMT <BINARY|STRUCT> |
DUMP_FILE <字符串常量>

(3)参数说明

参数名描述
sess_id为0,表示为所有会话,省略表示为当前会话。
event_defs确定跟踪事件,可以同时设置多个跟踪事件,各个事件由符号“:”分隔。
event_nameIMMEDIATE时,表示诊断立即执行,且仅执行一次,IMMEDIATE不允许与<trace_qualifier>中的FOREVER关键字一起使用。
整数值常量,表示只在对应的错误码或事件号触发时执行。其值取负数就对应系统的错误码;取10000~10999之间的值则专指内部事件号,目前只能取值10001、10002、10003、10046或10053。其中,10001指操作符的监控事件;10002指DDL跟踪的事件;10003指针对全表扫描、嵌套循环连接等特定操作符的监控事件;10046指SQL语句分析和执行过程监控事件;10053指优化器的调试追踪事件。
当ecode 为10053,trace name为context时,对应的level只能是1 或2。
level_valueLevel 1:输出查询语句计划中单表过滤或者多表连接的优化过程。如果一条语句同时包含了上述两种优化,那么只输出多表连接的优化过程。
Level 2:输出查询语句计划中单表过滤以及多表连接的优化过程。

(4)优势

1、深入揭示优化器决策逻辑。

2、仅需通过会话级命令开启,无需修改参数,对生产环境影响较小。

(5)劣势

1、技术门槛高。

2、达梦未公开代价计算公式,不同版本的优化器算法差异较大,导致跟踪结果难以通用化解读。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • Leetcode 587. 安装栅栏
  • 针对面试- RabbitMQ消息队列篇
  • 基础编程题目集 7-1 厘米换算英尺英寸
  • java基础(面向对象高级部分)
  • 快速扩容VHD文件的DiskPart命令指南
  • 临床研究统计分析核心概念解析
  • 【AI智能体】Spring AI Tool 从使用到实战详解
  • day28JS+Node-JS打包工具Webpack
  • multiprocessing多进程使用案例
  • 使用Python,OpenCV,Tesseract-OCR对自己的运动数据图片进行识别及分析,并使用Matplotlib绘制配速图出来
  • 【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述
  • 机器学习---特征降维
  • 运维Linux之Ansible详解学习(更新中)
  • Python应用运算符初解
  • Word转PDF--自动生成目录
  • 如何在uniapp H5中实现路由守卫
  • 【Vue3】(二)vue3语法详解:自定义泛型、生命周期、Hooks、路由
  • Linux C学习路线全概及知识点笔记1(仅供个人参考)
  • 【2025】基于Springboot + vue + 协同过滤算法实现的旅游推荐系统
  • 基于RK3576+FPGA+CODESYS工控板的运动控制模块方案
  • 网站中怎么做下载链接/企业文化培训
  • 测速网站开发/怎么关键词优化网站
  • 武汉网页推广哪家好/白杨seo课程
  • 帝国cms做企业网站/西安搜建站科技网站
  • 设计室内效果图设计/seo免费诊断
  • 网站开发后端/网络营销sem培训