定义:SQL语句的执行方式,由查询优化器为sql语句而设计的执行方式,传递给执行器执行。简单说,执行计划就是一条SQL语句在数据库中的执行过程、访问路径的描述。
例如:如下SQL语句:
select b.DEPARTMENT_NAME,c.JOB_TITLE,count(*) from "DMHR"."employee" a inner join "DMHR"."department" b on a.DEPARTMENT_ID=b.DEPARTMENT_ID inner join "DMHR"."job" c on c.JOB_ID=a.JOB_ID group by c.JOB_TITLE,b.DEPARTMENT_NAME order by b.DEPARTMENT_NAME;
1、sql方式查看执行计划
可以通过EXPLAIN语句用于打印执行计划:
explain
select
b.DEPARTMENT_NAME,
c.JOB_TITLE ,
count(*)
from
"DMHR"."employee" a
inner join "DMHR"."department" b
on
a.DEPARTMENT_ID=b.DEPARTMENT_ID
inner join "DMHR"."job" c
on
c.JOB_ID=a.JOB_ID
group by
c.JOB_TITLE,
b.DEPARTMENT_NAME
order by
b.DEPARTMENT_NAME;
执行计划如下:
执行计划如同树控制流一般,从上到下依次传递,数据流则从下到上依次传递
常见的操作符含义:
1)NSET:结果集收集。一般位于查询计划的顶层节点,此操作符一般没有优化空间。
2)PRJT:投影。
project运算,常用于选择表达式的计算。在查询、排序、函数索引创建等语句。优化过程中同样无过多优化空间
3)SLCR:选择。
用于查询条件的过滤。可比较返回结果集与代价估算中是否接近,如相差较大可考虑收集统计信息。若此类过滤条件过滤性比较好,可在条件列增加索引。
4)AAGR:简单过滤。
在没有GROUP BY的COUNT、SUM、AGE、MAX、MIN等聚集函数的计算。
5) SAGR:快速聚集。
用于没有过滤条件时从表或索引快速获取 MAX、MIN、COUNT 值。
6) HAGR:HASH 分组聚集。
用于分组列没有索引只能走全表扫描的分组聚集,该示例中 C2 列没有创建索引。
7) SAGR2:流分组聚集。
用于分组列是有序的情况下,可以使用流分组聚集,C1 列上已经创建了索引,SAGR2 性能优于 HAGR2。
8) BLKUP:二次扫描 (回表)。
先使用二级索引索引定位 rowid,再根据表的主键、聚集索引、rowid 等信息获取数据行中其它列。
9) CSCN:全表扫描。
CSCN2 是 CLUSTER INDEX SCAN 的缩写即通过聚集索引扫描全表,全表扫描是最简单的查询,如果没有选择谓词,或者没有索引可以利用,则系统一般只能做全表扫描。全表扫描 I/O 开销较大,在一个高并发的系统中应尽量避免全表扫描。
10) SSEK、CSEK、SSCN:索引扫描。
SSEK2 是二级索引扫描即先扫描索引,再通过主键、聚集索引、rowid 等信息去扫描表。CSEK2 是聚集索引扫描只需要扫描索引,不需要扫描表,即无需 BLKUP 操作,如果 BLKUP 开销较大时,可考虑创建聚集索引。SSCN 是索引全扫描,不需要扫描表。
11)NEST LOOP:嵌套循环连接。
嵌套循环连接最基础的连接方式,将一张表(驱动表)的每一个值与另一张表(被驱动表)的所有值拼接,形成一个大结果集,再从大结果集中过滤出满足条件的行。驱动表的行数就是循环的次数,将在很大程度上影响执行效率。如果连接列自身并无索引,将会大幅影响执行效率。
在T1、T2列的连接列创建索引并收集统计信息:
CREATE INDEX IDX_T1_C2 ON T1(C2);
CREATE INDEX IDX_T2_C1 ON T2(C1);
DBMS_STATS.GATHER_INDEX_STATS(USER,'IDX_T1_C2');
DBMS_STATS.GATHER_INDEX_STATS(USER,'IDX_T2_C1');
适用场景:
1、驱动表有很好的过滤条件
2、表连接条件能使用索引
3、结果集比较小
12)HASH JOIN:哈希连接
哈希连接是在没有索引或索引无法使用情况下大多数连接的处理方式。哈希连接使用关联列去重后结果集较小的表做成 HASH 表,另一张表的连接列在 HASH 后向 HASH 表进行匹配,这种情况下匹配速度极快,主要开销在于对连接表的全表扫描以及 HASH 运算。
哈希连接比较消耗内存如果系统有很多这种连接时,需调整以下 3 个参数:
13)MERGE JOIN:归并排序连接
归并排序连接需要两张表的连接列都有索引,对两张表扫描索引后按照索引顺序进行归并。
达梦社区地址:https://eco.dameng.com