达梦数据库-学习-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、达梦未公开代价计算公式,不同版本的优化器算法差异较大,导致跟踪结果难以通用化解读。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20200201工作笔记常用命令要整理

工作笔记常用命令&#xff1a; 1.repo常用命令&#xff1a; repo sync -c -j10 2. 常用adb命令 错误: error: device unauthorized. This adbds $ADB_VENDOR_KEYS is not set; try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your d…

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介

概览 到2025年&#xff0c;虽然PET&#xff08;Pattern-Exploiting Training&#xff09;和Prompt Tuning在学术界仍有探讨&#xff0c;但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调&#xff08;PEFT&#xff09;方法取代 。LoRA因其实现简单、推理零开销&#…

9种方法,一键美化Python图表

Matplotlib、Seaborn默认参数不好看&#xff0c;美化需要大量代码。 本次分享9种方法&#xff0c;一键美化图表&#xff0c;看看那个是你的菜。 1 Matplotlib style sheets Matplotlib内置多类style sheets&#xff0c; 一行代码使用&#xff0c; plt.style.use(Solarize_Li…

在STM32上配置图像处理库

在STM32上配置并使用简单的图像滤波库(以实现均值滤波为例,不依赖复杂的大型图像处理库,方便理解和在资源有限的STM32上运行)为例,给出代码示例,使用STM32CubeIDE开发环境和HAL库,假设已经初始化好了相关GPIO和DMA(如果有图像数据传输需求),并且图像数据存储在一个二…

Android四大组件学习总结

​1. Activity 启动模式问题​ ​面试官​&#xff1a; “我看你项目里用了 SingleTask 模式&#xff0c;能具体说说为什么用它吗&#xff1f;如果从 Activity A&#xff08;SingleTask&#xff09;跳转到 B&#xff08;Standard&#xff09;&#xff0c;再返回 A&#xff0c;…

基于SamOutV8的序列生成模型实现与分析

项目概述 本项目实现了基于SamOutV8架构的序列生成模型&#xff0c;核心组件包括MaxStateSuper、FeedForward和DecoderLayer等模块。通过结合自注意力机制与状态编码策略&#xff0c;该模型在处理长序列时表现出良好的性能。 核心组件解析 1. MaxStateSuper&#xff08;状态编…

从脑电图和大脑记录中学习稳健的深度视觉表征

从脑电图和大脑记录中学习稳健的深度视觉表征 印度&#xff0c;印度&#xff0c;印度&#xff0c;印度大脑实验室&#xff0c;印度 例如&#xff0c;达拉普&#xff0c;克普拉萨德&#xff0c;山&#xff0c;山&#xff0c;新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…

2025.5个人感悟

本人是一名2025级大四学生&#xff0c;离毕业就一个月了&#xff0c;目前论文终稿已写完&#xff0c;有多的时间可以来写一写博客了。 &#xff08;1&#xff09;越焦虑什么&#xff0c;未来就有可能变成什么样子。以前一直焦虑考不上研&#xff0c;秋招找不到工作&#xff0c…

使用腾讯云3台轻量云服务器快速部署K8s集群实战

一、服务器配置 1.集群数量 节点ip备注master10.0.4.9安全组放通&#xff0c;3节点内网互通node110.0.4.14安全组放通&#xff0c;3节点内网互通node210.0.4.17安全组放通&#xff0c;3节点内网互通 2.配置服务器&#xff08;每个节点执行&#xff09; 执行步骤1 #在对应的…

bitbar环境搭建(ruby 2.4 + rails 5.0.2)

此博客为武汉大学WA学院网络安全课程&#xff0c;理论课大作业Web环境搭建。 博主搭了2天&#xff01;&#xff01;&#xff01;血泪教训是还是不能太相信ppt上的教程。 一开始尝试了ppt上的教程&#xff0c;然后又转而寻找网络资源 cs155源代码和docker配置&#xff0c;做到…

leetcode:2469. 温度转换(python3解法,数学相关算法题)

难度&#xff1a;简单 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数…

python 实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能

多视角三维重建系统 下面我将实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能。 1. 环境准备与数据加载 首先安装必要的库: pip install opencv-python opencv-contrib-python numpy matplotlib plotly s…

什么是国密、密评、商密

一、国密 定义与本质&#xff1a;国密即国家密码管理局公布认定的国产密码算法&#xff0c;也称为商用密码&#xff08;在此语境下与国密通用&#xff09;&#xff0c;指能够实现商用密码算法的加密、解密和认证等功能的技术&#xff0c;涵盖密码算法编程技术和密码算法芯片、…

打卡35天

模型可视化与推理 知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化 进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观 推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&…

kafka之操作示例

一、常用shell命令 #1、创建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replications 1 --topic test#2、查看创建的topic bin/kafka-topics.sh --list --zookeeper localhost:2181#3、生产者发布消息命令 &#xff08;执行完此命令后在控制台输入要发…

网络安全基础--第七课

路由表 路由器的转发原理&#xff1a;当一个数据包进入路由器&#xff0c;路由器将基于数据包中的目标IP地址&#xff0c;查询本地 路由表&#xff0c;若表中存在记录&#xff0c;则将无条件按记录转发&#xff0c;若没有记录&#xff0c;路由器不能泛洪&#xff0c;因为路由器…

Java SpringBoot 扣子CozeAI SseEmitter流式对话完整实战 打字机效果

书接上回&#xff1a;springBoot 整合 扣子cozeAI 智能体 对话https://blog.csdn.net/weixin_44548582/article/details/147457236 上文实现的是一次性等待并得到完整的AI回复内容&#xff0c;但随着问题和AI的逻辑日趋复杂&#xff0c;会明显增加这个等待时间&#xff0c;这对…

《AVL树完全解析:平衡之道与C++实现》

目录 AVL树的核心概念数据结构与节点定义插入操作与平衡因子更新旋转操作&#xff1a;从理论到代码双旋场景深度剖析平衡检测与测试策略性能分析与工程实践总结 0.前置知识&#xff1a;BS树 代码实现部分对和BS树相似的部分会省略。 1. AVL树的核心概念 1.1 平衡二叉搜索树…

跨平台游戏引擎 Axmol-2.6.0 发布

Axmol 2.6.0 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 &#x1f64f;感谢所有贡献者及财务赞助者&#xff1a;scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 相对于2.5.0版本的重要变更&#xff1a; 通…

【Django Serializer】一篇文章详解 Django 序列化器

第一章 Django 序列化器概述 1.1 序列化器的定义 1.1.1 序列化与反序列化的概念 1. 序列化 想象你有一个装满各种物品&#xff08;数据对象&#xff09;的大箱子&#xff08;数据库&#xff09;&#xff0c;但是你要把这些物品通过一个狭窄的管道&#xff08;网络&#xff…