达梦数据库系列—40.执行计划

目录

优化器

执行计划

操作符

执行过程


优化器

查询优化器通过分析可用的执行方式和查询所涉及的对象统计信息来生成最优的执行计划。此外,如果存在 HINT 优化提示,优化器还需要考虑优化提示的因素。

查询优化器的处理过程包括:

1.优化器生成所有可能的执行计划集合;

2.优化器基于字典信息的数据分布统计值、执行语句涉及到的表、索引和分区的存储特点来估算每个执行计划的代价。代价是指 SQL 语句使用某种执行方式所消耗的系统资源的估算值。其中,系统资源消耗包括 I/O、CPU 使用情况、内存消耗等;

3.优化器选择代价最小的执行方式作为该条语句的最终执行计划。

优化器所做的操作有:查询转换、估算代价、生成计划。

执行计划

生成计划指计划生成器对给定的查询按照连接方式、连接顺序、访问路径生成不同的执行计划,选择代价最小的一个作为最终的执行计划。

查看执行计划

  1. 通过EXPLAIN命令查看
  2. 通过管理工具查看

操作符

CSCN :基础全表扫描(a),从头到尾,全部扫描

SSCN :二级索引扫描(b), 从头到尾,全部扫描

SSEK :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值

CSEK :聚簇索引范围扫描 ,通过键值精准定位到范围或者单值

BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)

NSET:用于结果集收集的操作符,一般是查询计划的顶层节点

PRJT:关系的“投影”(project)运算,用于选择表达式项的计算;

SLCT:关系的“选择” 运算,用于查询条件的过滤。

AAGR:简单聚集,用于没有group by的count sum age max min等聚集函数的计算

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

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

SAGR:流分组聚集,用于分组列是有序的情况下,可以使用流分组聚集,C1上已经创建了索引,SAGR2性能优于HAGR2

准备测试表和数据

DROP TABLE T1;

DROP TABLE T2;

CREATE TABLE T1(C1 INT ,C2 CHAR(1),C3 VARCHAR(10) ,C4 VARCHAR(10) );

CREATE TABLE T2(C1 INT ,C2 CHAR(1),C3 VARCHAR(10) ,C4 VARCHAR(10) );

INSERT INTO T1

SELECT LEVEL C1,CHR(65+MOD(LEVEL,57)) C2,'TEST',NULL FROM DUAL

CONNECT BY LEVEL<=10000;

INSERT INTO T2

SELECT LEVEL C1,CHR(65+MOD(LEVEL,57)) C2,'TEST',NULL  FROM DUAL

CONNECT BY LEVEL<=10000;

CREATE INDEX IDX_C1_T1 ON T1(C1);

SP_INDEX_STAT_INIT(USER,'IDX_C1_T1');

CSCN 全表扫

explain select * from t1 where c2='test';

BLKUP 回表查找

EXPLAIN SELECT * FROM T1 WHERE C1=10;

SSEK 索引范围扫

explain select c1 from t1 where c1 < 100;

SSCN 索引全表扫

explain select c1 from t1;

CSEK 聚簇索引扫

CREATE CLUSTER INDEX IDX_C1_T2  ON T2(C1);

EXPLAIN SELECT * FROM T2 WHERE C1=10;

AAGR 简单聚集 没有groupby的简单聚集

EXPLAIN SELECT COUNT(*) FROM T1 WHERE C1 = 10;

FAGR 快速聚集 没有过滤条件

EXPLAIN SELECT COUNT(*) FROM T1 ;

HAGR HASH分组聚集 没有走索引的groupby

EXPLAIN SELECT COUNT(*) FROM T1 GROUP BY C2;

SAGR 流分组聚集 有索引的groupby

EXPLAIN SELECT COUNT(*) FROM T1 GROUP BY C1;

执行过程

建表和建索引语句:

    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');

执行计划:

  EXPLAIN SELECT A.C1+1,B.D2 FROM T1 A, T2 B WHERE A.C1 = B.D1;

执行过程

控制流从上向下传递,数据流从下向上传递。[1,12,56]分别表示估算的操作符代价(毫秒)、处理的记录行数和每行记录的字节数。

该计划的大致执行流程如下:

1.CSCN2,扫描 T2 表的聚集索引,结果返回给父节点;

2.父节点NEST LOOP将数据作为左孩子,取右侧数据

3.SSEK2,利用T2表的D1列索引IDX_T1_C1,结果返回给父节点;

4.父节点NEST LOOP将数据作为右孩子,将连接结果返回PRJT2

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

6.NSET2: 输出最后结果;

7.重复以上,至CSCN2 数据全部取完。

达梦技术社区:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奥德彪的蕉

天不生我奥德彪,非洲无人拉香蕉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值