执行计划是对SQL语句在数据库中的执行过程或访问路径的描述。对于一个SQL查询任务,执行计划是数据库给出的完成此任务的纤细方案。
创建表和相关索引。
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 t1 values(5,'E');
insert into t2 values(1,'A');
insert into t2 values(2,'B');
insert into t2 values(6,'C');
insert into t2 values(7,'D');
再使用EXPLAN语句查看执行计划如下:
执行计划看起来就像一棵树。执行过程为:控制流从上向下传递,数据流从下向上传递。其中,类似【1,4,56】这样的三个数字,分别表示估算的操作符代价(毫秒)、处理的记录行数和每行记录的字节数。对于同一层次中的操作符,如本例中的CSCN2和SEEK2,由父节点NEST LOOP INDEX JOIN2控制他们的执行顺序。
该计划的大致执行流程如下:
- CSCN2:扫描t2表的聚集索引,数据传递给父节点。
- NEST LOOP INDEX JOIN2:当左孩子节点有数据返回时取右侧数据。
- SSEK:利用t2表当前的d1值作为二级索引IND_T1_C1定位查找的键,返回结果给父节点。
- NEST LOOP INDEX JOIN2:若右孩子节点有数据,则将结果传递给父节点PRJT2,否则继续读取左孩子节点的下一条记录。
- PRJT2:计算表达式C1+1和d2的值。
- NSET2:输出最后结果。
- 重复过程(1)—(4)直至左侧的CSCN2数据全部取完。
执行计划的常见操作符:
NEST2:用于结果集收集的操作符
PRJT2:关系的投影运算,用于选择表达式的计算;
BLKUP2:二次扫描(回表)
SSEK2:二级索引扫描
SLCT:选择,用于查询条件的过滤;
AAGR:简单聚集,用于没有GROUP BY的COUNT、SUM等聚集函数的计算;
HASH JOIN:哈希连接,在没有索引或索引无法使用情况下的表的连接方式。
说明:达梦默认创建的是索引组织表,每个表都有一个唯一的聚簇索引(clustered index ),除此之外的非聚簇索引叫二级索引(secondary indexes)。
在disql中设置set autotrace trace后执行可以显示真实计划