概念描述
达梦数据库跟oracle、mysql一样,也有自己的优化器,优化器会根据需要执行的sql,计算出执行该sql使用的各种方案的代价(即时间),然后会选择一个代价最低的方案,去执行SQL。也就是执行计划。
常用的查看执行计划有两种方式:
1.EXPLAIN+SQL语句
查看执行计划,在需要执行的sql前,加上explain关键字即可。
2.使用ET工具。
ET是达梦数据库自带的SQL 性能分析工具,能统计执行计划中,每个操作符的时间花费(将代价显示为具体的时间),从而定位到有性能问题的操作,指导我们去优化。
为了便于我们后续理解执行计划中的各个步骤,建立如下测试表并插入数据:
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;
--创建T1表索引
CREATE INDEX IDX_C1_T1 ON T1(C1);
SP_INDEX_STAT_INIT(USER,'IDX_C1_T1');
测试验证
本节主要通过方法1:EXPLAIN+SQL语句。理解执行计划中的场景步骤及作用。
通过EXPLAIN命令获取执行计划。
主要能输出如下列信息:
名称:计划节点的操作符。即上面的CSCN2/PRJT2等列信息。
代价:每个操作符花费的时间,这里以数字表示。【】的第一部分
结果集:每个操作符返回的结果条数。【】的第二部分
行数据处理长度:执行节点的字节数。【】的第三部分
附加信息:每个操作符执行的操作。【】后面的部分。
上面看到,执行计划各个步骤(计划节点的操作符)不太好理解。为了更好的理解并加深记忆。通过如下语句测试各操作符的含义。
2.1 PRJT:投影、NSET:结果集收集
主要作用:
NSET2:结果集收集。理解为返回记录。
PRJT2:投影。用于将查询出的结果集投影。
如图。在查询出相应记录后,通过PRJT2、NSET2最终返回记录。
2.2 SLCT:过滤
主要作用:
SLCT2:选择,查询条件的过滤。
对访问的结果集进行条件过滤。如WHERE条件。
2.3 AAGR:简单聚集
主要作用:
AAGR2:简单聚集,用于没有 GROUP BY 的 COUNT、SUM、AGE、MAX、MIN 等聚集函数的计算。
对访问的结果集进行条件过滤。之后求COUNT聚合。动作是AAGR2聚合步骤。
2.4 FAGR:快速聚集
主要作用:
FAGR2:快速聚集,用于没有过滤条件时从表或索引快速获取 MAX、MIN、COUNT 值。
通过访问索引,直接快速获得相应列的最大最小值等。从而理解为快速聚合。
2.5 HAGR:HASH分组聚集
主要作用:
HAGR2:HASH分组聚集。通常是分组列上无索引或无序时,通过HASH聚合。
对应T1表上的C2列上没有索引,因此通过HASH聚合。
2.6 SAGR:流分组聚集
主要作用:
SAGR2:流分组聚集,用于分组列是有序的情况下,可以使用流分组聚集,C1 列上已经创建了索引,SAGR2 性能优于 HAGR2。
对应T1表上的C1列上有索引,因此是有序的。可以通过索引提升聚合效率。
2.7 SSEK:二级索引扫描
主要作用:
SSEK:二级索引扫描即先扫描索引,再通过主键、聚集索引、rowid 等信息去扫描表。
通过索引IDX_C1_T1完成过滤,扫描满足条件C1=10的数据。
2.8 BLKUP:二次扫描 (回表)
主要作用:
BLKUP2:二次扫描 (回表)。访问索引后,再去表中查找其余列数据。
通过索引IDX_C1_T1完成过滤,扫描满足条件C1=10的数据。之后回表获取所有列数据。
2.9 CSCN:全表扫描
主要作用:
CSCN2:全表扫描,CLUSTER INDEX SCAN
无法使用索引时,会通过全表扫描访问数据。也可以理解为聚集索引全扫描。
2.10 SSCN:索引全扫描
主要作用:
SSCN:索引全扫描,只需要扫描索引,不需要扫描表。
通过扫描索引全部叶子节点,即可返回数据,不需要扫描表的情况。
2.11 NEST LOOP:嵌套循环连接
主要作用:
NEST LOOP:嵌套循环连接,NLI2。根据驱动表返回行数,循环访问被驱动表并返回关联结果数据。
嵌套循环连接时,会根据驱动表返回行数。来确定被驱动表的访问次数。
2.12 HASH JOIN:哈希连接
主要作用:
HASH JOIN:哈希连接。当关联条件没有索引时,两个表关联通常都会采用HASH关联。
HASH关联的好处是驱动表和被驱动表只会访问一次。
2.13 MERGE JOIN:排序合并连接
主要作用:
MERGE JOIN:排序合并连接需要两张表的连接列都有索引,对两张表扫描索引后按照索引顺序进行关联。
通常需要两张表的关联列均有索引才能完成排序合并连接,因为索引能保证关联列是有序的。
ET工具查看真实的执行计划
ET是达梦数据库自带的SQL 性能分析工具,能统计执行计划中,每个操作符的时间花费(将代价显示为具体的时间),从而定位到有性能问题的操作,指导我们去优化。
ET是默认关闭的,因此在使用ET之前,需要先开启:
--开启ET。需要使用DBA角色
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);
--关闭ET。ET会对数据库性能有影响,使用完后记得关闭以保证数据库性能不受影响。
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',0);
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',0);
--查看ET是否开启
select * from v$parameter t where NAME = 'MONITOR_SQL_EXEC';
select * from v$parameter t where NAME = 'ENABLE_MONITOR';
--ENABLE_MONITOR,动态参数(系统级)
--MONITOR_SQL_EXEC,动态参数(会话级)
3.1 通过ET查看SQL真实执行计划
1.首先开启ET监控:
2.执行查询获取SQL的执行号:
select * from sqm.t1 inner join sqm.t2 on t1.c1=t2.c1 where t1.c2='A';
3.查看详细的执行计划:
CALL ET(875933405);
主要能输出如下列信息:
OP:操作符。
TIME(US):时间开销,单位为微秒
PERCENT:执行时间占总时间百分比。一般用于定位执行计划中的耗时步骤。
RANK:执行时间的耗时排序
SEQ:执行计划的节点号。用于结合EXPLAIN对比当前节点步骤。
N_ENTER:进入次数
3.2 利用ET优化耗时步骤
通过ET生成的真实执行计划,一般需要结合EXPLAIN生成的执行计划树,理解耗时步骤的原因,并进行分析优化。如上例中的语句。
分别通过EXPLAIN及ET获取执行计划树和耗时步骤。
T1和T2表通过嵌套循环关联。
通过耗时步骤分析,主要耗时就发生在第七步骤中的全表扫描部分。由于是嵌套循环关联,被驱动表T2会访问多次,造成执行耗时。
SELECT TABLE_OWNER as "模式名",
TABLE_NAME as "表名",
COLUMN_NAME as "列名",
INDEX_NAME as "索引名"
from DBA_IND_COLUMNS
WHERE TABLE_OWNER = 'SQM';
由于当前仅有T1表有关联列C1索引。T2表的关联列无索引,造成多次的嵌套循环关联造成执行效率较低。为了优化耗时步骤T2表的访问。需要对T2的关联列C1创建索引。
create index idx_c1_t2 ON t2(c1);
调整后重新查看执行计划:
对应T2表已经由全表扫描变为索引扫描,同时观察整个嵌套循环步骤的COST值。由原有的17862下降到3。也说明整个嵌套循环步骤有了较大程度的性能提升。
再结合真实的执行计划对比:
执行时间由74ms下降到7ms。
原有的第七步骤(T2表访问)也不再是最耗时的步骤。各步骤的整体耗时均有了10倍左右的降低。目前的主要耗时步骤集中在第5步骤了。即:T1表的全表扫描。
接下来如果进一步优化,可以从第五步骤的T1表入手(过滤条件T1.C2 = ‘A’)。继续创建索引可降低T1表的全表扫描影响。这里不再进行测试。
知识总结
达梦数据库的执行计划相对ORACE来看,优化器的原理等基本一致。主要是执行步骤标识符存在一定的差异。需要结合具体步骤去理解记忆。
参考文档
https://www.cnblogs.com/wuran222/p/15132004.html
https://blog.csdn.net/dcps75321/article/details/124120810
标签:步骤,数据库,扫描,T1,解读,索引,ET,执行,达梦 From: https://blog.51cto.com/u_13482808/7446839