注册
达梦disql查看执行计划入门
技术分享/ 文章详情 /

达梦disql查看执行计划入门

Captain J 2026/08/14 100 0 0

步骤1:连接数据库

/disql 用户名/密码:端口

步骤2:查看预估执行计划

SQL> explain sql语句;

步骤3:开启会话监控

SQL> sf_set_session_para_value('MONITOR_SQL_EXEC',1);
  • 详解:此命令用于在当前会话开启SQL执行监控。这是后续使用AUTOTRACE和ET功能获取真实执行统计信息的前提
  • 补充:
  • 此设置仅对当前会话有效。关闭会话后即失效。
  • 若要对整个数据库生效,可使用SP_SET_PARA_VALUE(1,‘MONITOR_SQL_EXEC’,1);。但需注意,开启监控会带来额外性能开销,建议在诊断结束后及时关闭(设置为0)。
  • 另一个相关的全局参数是ENABLE_MONITOR,开启ET功能通常需要同时开启它。

步骤4:开启实际执行计划跟踪

SQL> set autotrace trace;
  • 详解:SET AUTOTRACE TRACE命令开启了实际执行计划的跟踪。设置后,当你执行SQL时,disql不仅会返回结果集,还会输出该SQL真实执行时的计划和统计信息(如逻辑读、物理读等)。这比EXPLAIN的预估计划更准确。
  • 补充:
  • SET AUTOTRACE TRACEONLY:与TRACE类似,但不显示查询的结果集,只显示执行计划和统计信息。在查看返回大量数据的SQL时非常有用。
  • 该命令通常与步骤3搭配使用,以确保能收集到真实的运行时数据。

步骤5:编辑并执行SQL

SQL> ed (在打开的编辑器中粘贴SQL,保存退出) SQL> /
  • 详解:
  • ed:调用系统默认编辑器(Linux下通常是vi,Windows下是记事本)打开一个缓冲区。你可以在此编辑SQL语句。
  • :wq:在vi编辑器中保存并退出。
  • /:执行当前保存在缓冲区中的SQL语句。
  • 一般用户sql比较长,直接粘贴有可能导致语句截断的情况下使用。
  • 补充:这种“编辑-执行”的方式,特别适合编写和调试复杂的、多行的SQL或匿名块。执行后,由于已开启AUTOTRACE,你会同时看到结果集(或仅计划)和真实的执行统计信息。

步骤6:获取ET(节点耗时分析)

SQL> et(执行号);
  • 详解:ET是达梦自带的SQL性能分析工具。执行一个SQL后,disql会返回一个“执行号”。使用ET(执行号),可以查看到该SQL执行计划中每个操作符节点的真实耗时、进入次数等详细信息。
  • 补充:
  • ET结果解读:结果中关键的列有OP(操作符)、TIME(us)(耗时,微秒)、PERCENT(占总时间百分比)和N_ENTER(进入次数)。耗时占比高的操作符就是优化的首要目标。
  • ET与AUTOTRACE的区别:AUTOTRACE提供SQL整体的执行统计和计划,而ET能精确到计划中每一个步骤的耗时,是定位瓶颈操作符的利器。

实战

优化前部分执行计划

1 #NSET2: [5, 23->18746, 975] 2 #PRJT2: [5, 23->18746, 975]; exp_num(29), is_atom(FALSE) 3 #SORT3: [5, 23->18746, 975]; key_num(1), is_distinct(FALSE), is_adaptive(0), MEM_USED(13953KB), DISK_USED(16383KB) 4 #PRJT2: [4, 23->18746, 975]; exp_num(29), is_atom(FALSE) 5 #UNION ALL: [4, 23->18746, 975] 6 #PRJT2: [2, 1->6301, 975]; exp_num(29), is_atom(FALSE) 7 #HASH LEFT JOIN2: [2, 1->6301, 975]; key_num(1); col_num(25); partition_keys_num(0); mix(0); MEM_USED(29359KB), DISK_USED(0KB) KEY(DR.BIZ_TYPE_CODE=DBT.BIZ_TYPE_CODE) 8 #HASH LEFT JOIN2: [1, 1->6301, 975]; key_num(1); col_num(24); partition_keys_num(0); mix(0); MEM_USED(23663KB), DISK_USED(0KB) KEY(DR.CUST_NO=DUPS.UNIT_NO) 9 #SLCT2: [1, 1->6301, 975]; DR.CURRENCY_CODE = 'CNY' 10 #NEST LOOP INDEX JOIN2: [1, 1->6301, 975] 11 #BLKUP2: [1, 1->6301, 73]; INDEX_DPS_RECEIPT_BOOK_2(DPS_RECEIPT_BOOK) 12 #SSEK2: [1, 1->6301, 73]; scan_type(ASC), INDEX_DPS_RECEIPT_BOOK_2(DPS_RECEIPT_BOOK), scan_range[exp_cast('2026-07-01'),exp_cast('2026-07-28')] 13 #BLKUP2: [1, 1->6301, 30]; INDEX33567690(DPS_RECEIPT) 14 #SSEK2: [1, 1->6301, 30]; scan_type(ASC), INDEX33567690(DPS_RECEIPT), scan_range[DRB.DPS_RECEIPT_ID,DRB.DPS_RECEIPT_ID] 15 #CSCN2: [1, 440->444, 96]; INDEX33567663(DPS_UNIT_PRINT_SETTING) 16 #CSCN2: [1, 5->5, 96]; INDEX33567673(DPS_BIZ_TYPE) 17 #PRJT2: [1, 22->12445, 287]; exp_num(29), is_atom(FALSE) 18 #INDEX JOIN LEFT JOIN2: [1, 22->12445, 287]: col_num(15); join condition((DAB.ACNT_NO = AGEREE.CURRENT_ACCOUNT_NO AND DAB.BALANCE_DATE >= AGEREE.START_DATE AND AGEREE.STATUS IN LIST)) ret_null(0) 19 #HASH LEFT JOIN2: [1, 1->12445, 287]; key_num(1); col_num(9); partition_keys_num(0); mix(0); MEM_USED(14895KB), DISK_USED(0KB) KEY(DAB.CUST_NO=DUPS.UNIT_NO) 20 #SLCT2: [1, 1->12445, 287]; DAB.CURRENCY = 'CNY' 21 #BLKUP2: [1, 1->12445, 287]; DPS_ACCOUNT_BALANCE_IDX2(DPS_ACCOUNT_BALANCE) 22 #SSEK2: [1, 1->12445, 287]; scan_type(ASC), DPS_ACCOUNT_BALANCE_IDX2(DPS_ACCOUNT_BALANCE), scan_range[exp_cast('2026-07-01'),exp_cast('2026-07-28')] 23 #CSCN2: [1, 440->444, 144]; INDEX33567663(DPS_UNIT_PRINT_SETTING) 24 #BLKUP2: [1, 22->6399718, 13]; IDX_DPS_AGREEMENT_4(DPS_AGREEMENT) 25 #SSEK2: [1, 22->6399718, 13]; scan_type(ASC), IDX_DPS_AGREEMENT_4(DPS_AGREEMENT), scan_range(DAB.BALANCE_DATE,max) Statistics ----------------------------------------------------------------- 0 data pages changed 0 undo pages changed 12870877 logical reads 0 physical reads 0 redo size 6956736 bytes sent to client 6477 bytes received from client 15 roundtrips to/from client 0 sorts (memory) 1 sorts (disk) 18746 rows processed 0 io wait time(ms) 9623 exec time(ms) 已用时间: 00:00:09.598. 执行号:283332604. SQL> et(283332604); --此处仅展示慢的部分 行号 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 -------------------- ----------------- --------------- -------------------- 26 BLKUP2 8535071 88.91% 1 24 74670 0 0 0 0 NULL NULL 0 26 rows got

增加覆盖索引,减少回表后

1 #NSET2: [84, 46286->75636, 975] 2 #PRJT2: [84, 46286->75636, 975]; exp_num(29), is_atom(FALSE) 3 #SORT3: [84, 46286->75636, 975]; key_num(1), is_distinct(FALSE), is_adaptive(0), MEM_USED(42438KB), DISK_USED(81253KB) 4 #PRJT2: [69, 46286->75636, 975]; exp_num(29), is_atom(FALSE) 5 #UNION ALL: [69, 46286->75636, 975] 6 #PRJT2: [18, 12236->23340, 975]; exp_num(29), is_atom(FALSE) 7 #HASH RIGHT JOIN2: [18, 12236->23340, 975]; key_num(1); col_num(25); MEM_USED(11951KB), DISK_USED(0KB) KEY(DBT.BIZ_TYPE_CODE=DR.BIZ_TYPE_CODE) 8 #CSCN2: [1, 5->5, 96]; INDEX33567673(DPS_BIZ_TYPE) 9 #HASH RIGHT JOIN2: [15, 12236->23340, 975]; key_num(1); col_num(24); MEM_USED(11951KB), DISK_USED(0KB) KEY(DUPS.UNIT_NO=DR.CUST_NO) 10 #CSCN2: [1, 440->444, 96]; INDEX33567663(DPS_UNIT_PRINT_SETTING) 11 #HASH2 INNER JOIN: [11, 12236->23340, 975]; LKEY_UNIQUE KEY_NUM(1), MEM_USED(13743KB), DISK_USED(0KB) KEY(DR.ID=DRB.DPS_RECEIPT_ID) KEY_NULL_EQU(0) 12 #SLCT2: [1, 836->836, 902]; DR.CURRENCY_CODE = 'CNY' 13 #CSCN2: [1, 734->836, 902]; INDEX33567689(DPS_RECEIPT) 14 #BLKUP2: [9, 10743->23340, 73]; INDEX_DPS_RECEIPT_BOOK_2(DPS_RECEIPT_BOOK) 15 #SSEK2: [9, 10743->23340, 73]; scan_type(ASC), INDEX_DPS_RECEIPT_BOOK_2(DPS_RECEIPT_BOOK), scan_range[exp_cast('2026-04-01'),exp_cast('2026-07-28')] 16 #PRJT2: [42, 34049->52296, 287]; exp_num(29), is_atom(FALSE) 17 #HASH RIGHT JOIN2: [42, 34049->52296, 287]; key_num(1); col_num(15); MEM_USED(12015KB), DISK_USED(0KB); join condition((DAB.BALANCE_DATE < AGEREE.END_DATE AND DAB.BALANCE_DATE >= AGEREE.START_DATE AND AGEREE.STATUS IN LIST)) KEY(AGEREE.CURRENT_ACCOUNT_NO=DAB.ACNT_NO) 18 #SSCN: [1, 707->707, 278]; IDX_DPS_AGREEMENT_3(DPS_AGREEMENT) 19 #HASH RIGHT JOIN2: [37, 34049->52296, 287]; key_num(1); col_num(9); MEM_USED(12463KB), DISK_USED(0KB) KEY(DUPS.UNIT_NO=DAB.CUST_NO) 20 #CSCN2: [1, 440->444, 144]; INDEX33567663(DPS_UNIT_PRINT_SETTING) 21 #SLCT2: [33, 34049->52296, 287]; (DAB.CURRENCY = 'CNY' AND DAB.BALANCE_DATE >= var7 AND DAB.BALANCE_DATE <= var8) 22 #CSCN2: [33, 192633->214326, 287]; INDEX33567730(DPS_ACCOUNT_BALANCE) Statistics ----------------------------------------------------------------- 0 data pages changed 0 undo pages changed 56794 logical reads 0 physical reads 0 redo size 27866802 bytes sent to client 9053 bytes received from client 55 roundtrips to/from client 0 sorts (memory) 1 sorts (disk) 75636 rows processed 0 io wait time(ms) 347 exec time(ms) 已用时间: 250.465(毫秒). 执行号:283673812. 再次查看et() 回表已消失
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服