达梦数据库执行计划查看方式

本文介绍了达梦数据库中查看SQL执行计划的三种方式:通过EXPLAIN和EXPLAIN FOR命令,使用AUTOTRACE参数以及在Manager图形化工具中查看。详细解析了各个方法的使用和输出信息,帮助理解SQL执行过程和优化查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

达梦数据库执行计划查看方式

数据库执行计划决定了SQL语句的执行方式,即决定如何访问存储设备中的数据,得到期望结果,它同时反应了数据访问方式和访问顺序。
达梦数据库执行计划是由查询优化器为SQL语句设计的执行方式,交给执行器去执行。达梦数据库查看SQL语句执行计划,主要有以下三种方式:
1. 在 SQL 命令行使用 EXPLAIN 可以打印出语句的执行计划。
使用EXPLAIN命令来查看SQL执行计划:

SQL> explain select * from sales.salesorder_detail; 
1   #NSET2: [0, 4, 102]  
2     #PRJT2: [0, 4, 102]; exp_num(7), is_atom(FALSE)  
3      #CSCN2: [0, 4, 102]; INDEX33555525(SALESORDER_DETAIL)

used time: 8.897(ms). Execute id is 0.

还可以使用EXPLAIN FOR命令来查看SQL执行计划:

explain for select * from dmhr.employee;

LINEID     PLAN_ID     PLAN_NAME CREATE_TIME                                                                                       LEVEL_ID    OPERATION TAB_NAME IDX_NAME      SCAN_TYPE SCAN_RANGE ROW_NUMS             BYTES       COST                 CPU_COST             IO_COST             
---------- ----------- --------- ---------------------------------------------------------------------------------------------------- ----------- --------- -------- ------------- --------- ---------- -------------------- ----------- -------------------- -------------------- --------------------
           FILTER JOIN_COND ADVICE_INFO PSTART      PSTOP      
           ------ --------- ----------- ----------- -----------
1          6           NULL      2020-11-08 20:44:05.000000                                                                           0           NSET2     NULL     NULL          NULL      NULL       856                  280         0                    0                    0
           NULL   NULL      NULL        0           0

2          6           NULL      2020-11-08 20:44:05.000000                                                                           1           PRJT2     NULL     NULL          NULL      NULL       856                  280         0                    0                    0
           NULL   NULL      NULL        0           0

3          6           NULL      2020-11-08 20:44:05.000000                                                                           2           CSCN2     EMPLOYEE INDEX33555540 NULL      NULL       856                  280         0                    0                    0
           NULL   NULL      NULL        0           0



1   #NSET2: [0, 1, 504] 
2     #PRJT2: [0, 1, 504]; exp_num(20), is_atom(FALSE) 
3       #SLCT2: [0, 1, 504]; 
4         #CSCN2: [0, 10, 504]; INDEX33555436(##PLAN_TABLE)

used time: 6.080(ms). Execute id is 50.

从上面两个结果来看,explain和explain for均显示执行计划,但explain for显示的结果更加详细。
2. 在SQL 命令行中设置AUTOTRACE参数值,查看执行计划。
AUTOTRACE参数用于设置执行计划和统计信息的跟踪。
语法如下:
SET AUTOTRACE <OFF(默认值) | NL | INDEX | ON|TRACE>

  • 当 SET AUTOTRACE OFF 时,停止 AUTOTRACE 功能,常规执行语句。
  • 当 SET AUTOTRACE NL 时,开启 AUTOTRACE 功能,不执行语句,如果执行计划中有嵌套循环操作,那么打印 NL
    操作符的内容。
  • 当 SET AUTOTRACE INDEX(或者 ON)时,开启 AUTOTRACE
    功能,不执行语句,如果有表扫描,那么打印执行计划中表扫描的方式、表名和索引。
  • 当 SET AUTOTRACE TRACE 时,开启 AUTOTRACE 功能,执行语句,打印执行计划。此功能与服务器 EXPLAIN语句的区别在于,EXPLAIN 只生成执行计划,并不会真正执行SQL 语句,因此产生的执行计划有可能不准。而 TRACE获得的执行计划,是服务器实际执行的计划
SQL> set autotrace trace
SQL> select * from sales.salesorder_detail;

LINEID     SALESORDERID SALESORDER_DETAILID CARRIERNO PRODUCTID   ORDERQTY    LINETOTAL
---------- ------------ ------------------- --------- ----------- ----------- ---------
1          1            1                   2007052   1           1           15.2000
2          1            2                   2007053   3           1           21.7000
3          2            1                   2007052   1           1           15.2000
4          2            2                   2007053   3           1           21.7000


1   #NSET2: [0, 4, 102] 
2     #PRJT2: [0, 4, 102]; exp_num(7), is_atom(FALSE) 
3       #CSCN2: [0, 4, 102]; INDEX33555525(SALESORDER_DETAIL)

used time: 4.648(ms). Execute id is 93.

3.在manager图形化管理工具中启动执行计划。
在manager工具中,在工具栏有显示执行计划按钮,可以显示出来SQL语句的执行计划,如下图所示:
在这里插入图片描述
在这里插入图片描述
执行计划缩进显示,层次最深的最先执行,层次相同,上面的先执行。显示时已经按照层次缩进,因此先从最里层进行查看。

<think>好的,我需要帮助用户了解如何在达梦数据库查看和优化执行计划。首先,我得回忆一下达梦数据库的相关文档和引用内容。根据提供的引用,特别是引用[1]和[2],执行计划是SQL调优的关键,能帮助识别性能瓶颈。用户可能想知道具体的查看方法和优化步骤。 首先,查看执行计划的方法。引用[1]提到使用EXPLAIN语句,而引用[2]和[3]也提到了不同的方式,比如V$CACHEPLAN视图和ET工具。需要把这些方法整理出来,分步骤说明,比如使用EXPLAIN、开启统计信息、ET工具等。 然后,优化执行计划的部分。需要包括分析执行计划结构,关注全表扫描、索引使用、连接方式等。引用[3]提到执行计划缓存,可能涉及到参数调整,比如ENABLE_MONITOR和MONITOR_SQL_EXEC。此外,优化策略如索引优化、避免隐式转换、减少关联表数量等也是重点。 还需要考虑生成相关问题,可能涉及执行计划缓存、性能分析工具、参数调整、常见误区等。要确保问题相关且有引导性,帮助用户深入理解。 需要注意的是,用户可能不熟悉专业术语,所以解释时要简明,比如说明全表扫描和索引扫描的区别,或者连接方式如NESTED LOOP和HASH JOIN的不同应用场景。同时,引用标注要正确,每个步骤后添加对应的引用标记,确保信息的可靠性。 最后,检查回答是否符合格式要求:行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不上数学公式。确保使用中文,结构清晰,分步骤说明,并自然地添加引用标识。避免使用Markdown,用口语化的思考过程,但最终回答要正式。</think>达梦数据库执行计划查看与优化可分为以下步骤: ### 一、查看执行计划的方法 1. **EXPLAIN命令** 使用$EXPLAIN$语句生成文本格式执行计划: ```sql EXPLAIN SELECT * FROM emp WHERE deptno=10; ``` 输出结果展示操作符顺序和层级关系[^2]。 2. **可视化工具** 在管理工具中按F9执行SQL,自动显示图形化执行计划,更直观展示数据流向和操作符成本。 3. **执行计划缓存查询** 通过系统视图分析历史执行计划: ```sql SELECT sql_text, plan_cache_id FROM V$CACHEPLAN WHERE sql_text LIKE '%emp%'; ``` 可查看已缓存的执行计划版本[^3]。 4. **实时监控** 启用监控参数后获取详细执行数据: ```sql SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1); SELECT * FROM V$SQL_PLAN_MONITOR; ``` ### 二、执行计划优化策略 1. **结构解析要点** - 操作顺序:从右向左、自底向上读取 - 重点关注: - $CSCN$(全表扫描)出现时考虑索引优化 - $BLKUP$(回表操作)过多需检查索引覆盖 - 连接方式选择:$NESTED LOOP$(小表驱动) vs $HASH JOIN$(大数据量) 2. **典型优化场景** ```sql -- 创建覆盖索引示例 CREATE INDEX idx_emp_dept ON emp(deptno) INCLUDE(ename,sal); ``` 3. **执行计划缓存管理** ```sql -- 清除特定SQL缓存 DBMS_SQLTUNE.PURGE_SQL_CACHE('sql_id'); -- 查看缓存命中率 SELECT cache_item, hit_count FROM V$CACHEPLAN; ``` ### 三、优化辅助工具 1. **ET性能分析** ```sql CALL SP_INIT_SESSION_EX(1,1); SELECT /*+ MONITOR */ * FROM emp WHERE sal>5000; SELECT * FROM V$SQL_PLAN_MONITOR; ``` 输出各算子执行时间占比。 2. **统计信息更新** ```sql -- 更新表统计信息 DBMS_STATS.GATHER_TABLE_STATS('SYSDBA','EMP'); -- 更新索引统计信息 DBMS_STATS.GATHER_INDEX_STATS('SYSDBA','IDX_EMP_DEPT'); ``` 3. **参数调优示例** ```sql -- 调整哈希连接内存 SP_SET_PARA_VALUE(2,'HJ_BUF_GLOBAL_SIZE',204800); -- 设置优化器模式 SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1); -- 0-基于规则 1-基于代价 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值