DM数据库之执行计划

what:

执行计划:一条 SQL 语句在数据库中的执行过程或访问路径的描述。

why:

查询优化器 (CBO) 根据SQL执行代价即资源开销,来选择最优的执行计划。

how:

如何查看执行计划

查看执行计划有两种方式:1.通过DM管理工具查看2.使用 SQL 语句查看。

下面具体介绍两种查看方式:

管理工具查看执行计划

在 DM 管理工具(Manager)中,点击下图中按钮,或使用快捷键 F9,即可查看相应sql语句的执行计划,如下图所示:

SELECT * FROM SYSOBJECTS;

SQL 方式查看执行计划:

在SQL 语句前加 explain, 执行 SQL 语句即可,如下图所示:

 

 

执行计划解读:

执行计划的每行即为一个计划节点,主要包含三部分信息。

第一部分 NEST2、PRJT2、CSCN2 为操作符及数据库具体执行了什么操作。

第二部分 三元组为该计划节点的执行代价,具体含义为[代价,记录行数,字节数]。

第三部分为操作符的补充信息。即:操作符是 CSCN2 即全表扫描,代价估算是 0 ms,扫描的记录行数是 1282 行,输出字节数是 396 个。

各计划节点的执行顺序为:缩进越多的越先执行,同样缩进的上面的先执行,下面的后执行,上下的优先级高于内外。

通过以下语句建表和建索引语句,举例详细说明执行计划:

CREATE TABLE T1(C1 INT,C2 CHAR);

CREATE TABLE T2(D1 INT,D2 CHAR);

CREATE INDEX IDX_T1_C1 ON T1(C1);

INSERT INTO T1 VALUES(1,'A');

INSERT INTO T1 VALUES(2,'B');

INSERT INTO T1 VALUES(3,'C');

INSERT INTO T1 VALUES(4,'D');

INSERT INTO T2 VALUES(1,'A');

INSERT INTO T2 VALUES(2,'B');

INSERT INTO T2 VALUES(5,'C');

INSERT INTO T2 VALUES(6,'D');

 

 

 执行过程为:控制流从上向下传递,数据流从下向上传递。同一层次中的操作符,即CSCN2 和 SSEK2,由父节点NEST LOOP INDEX JOIN2 控制它们的执行顺序。

该计划的大致执行流程为:

1) CSCN2: 扫描 T2 表的聚集索引,数据传递给父节点索引连接;

2) NEST LOOP INDEX JOIN2: 当左孩子有数据返回时取右侧数据;

3) SSEK2: 利用 T2 表当前的 D1 值作为二级索引 IDX_T1_C1 定位查找的 KEY,返回结果给父节点;

4) NEST LOOP INDEX JOIN2: 如果右孩子有数据则将结果传递给父节点 PRJT2,否则继续取左孩子的下一条记录;

5) PRJT2: 进行表达式计算 C1+1, D2;

6) NSET2: 输出最后结果;

7) 重复过程1 -4直至左侧 CSCN2 数据全部取完。

常见操作符解读

NSET:用于结果集收集的操作符,一般是查询计划的顶层节点,优化工作中无需对该操作符过多关注,一般没有优化空间。

PRJT:投影,关系的【投影】 (project) 运算,用于选择表达式项的计算。广泛用于查询,排序,函数索引创建等。优化工作中无需对该操作符过多关注,一般没有优化空间。

SLCT:选择,关系的【选择】运算,用于查询条件的过滤。可比较返回结果集与代价估算中是否接近,如相差较大可考虑收集统计信息。若该过滤条件过滤性较好,可考虑在条件列增加索引。

AAGR:简单聚集,用于没有 GROUP BY 的 COUNT、SUM、AGE、MAX、MIN 等聚集函数的计算。

SAGR:快速聚集,用于没有过滤条件时从表或索引快速获取 MAX、MIN、COUNT 值。

HAGR:HASH 分组聚集,用于分组列没有索引只能走全表扫描的分组聚集

BLKUP:二次扫描 (回表),先使用二级索引索引定位 rowid,再根据表的主键、聚集索引、rowid 等信息获取数据行中其它列。

CSCN:全表扫描,CSCN2 是 CLUSTER INDEX SCAN 的缩写即通过聚集索引扫描全表,全表扫描是最简单的查询,如果没有选择谓词,或者没有索引可以利用,则系统一般只能做全表扫描。全表扫描 I/O 开销较大,在一个高并发的系统中应尽量避免全表扫描。

NEST LOOP:嵌套循环连接,最基础的连接方式,将一张表(驱动表)的每一个值与另一张表(被驱动表)的所有值拼接,形成一个大结果集,再从大结果集中过滤出满足条件的行。驱动表的行数就是循环的次数,将在很大程度上影响执行效率。

SSEK、CSEK、SSCN:索引扫描;SSEK2 是二级索引扫描即先扫描索引,再通过主键、聚集索引、rowid 等信息去扫描表;CSEK2 是聚集索引扫描只需要扫描索引,不需要扫描表,即无需 BLKUP 操作,如果 BLKUP 开销较大时,可考虑创建聚集索引;SSCN 是索引全扫描,不需要扫描表。

也可通过动态视图 V$SQL_NODE_NAME查看更多操作符:

select * from v$sql_node_name order by name;

以上是本次分享的所有内容,如有错漏,欢迎指正。

每天持续进步一点点。

访问达梦技术社区,获取更多内容,网站地址:https://eco.dameng.com

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值