首页 > 数据库 >达梦数据库的执行计划解读

达梦数据库的执行计划解读

时间:2023-09-12 18:08:25浏览次数:42  
标签:步骤 数据库 扫描 T1 解读 索引 ET 执行 达梦

概念描述

达梦数据库跟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:投影。用于将查询出的结果集投影。

达梦数据库的执行计划解读_达梦_02


如图。在查询出相应记录后,通过PRJT2、NSET2最终返回记录。

2.2 SLCT:过滤

主要作用:
SLCT2:选择,查询条件的过滤。

达梦数据库的执行计划解读_执行计划_03


对访问的结果集进行条件过滤。如WHERE条件。

2.3 AAGR:简单聚集

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

达梦数据库的执行计划解读_执行计划_04

对访问的结果集进行条件过滤。之后求COUNT聚合。动作是AAGR2聚合步骤。

2.4 FAGR:快速聚集

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

达梦数据库的执行计划解读_执行计划_05


通过访问索引,直接快速获得相应列的最大最小值等。从而理解为快速聚合。

2.5 HAGR:HASH分组聚集

主要作用:
HAGR2:HASH分组聚集。通常是分组列上无索引或无序时,通过HASH聚合。

达梦数据库的执行计划解读_执行计划_06

对应T1表上的C2列上没有索引,因此通过HASH聚合。

2.6 SAGR:流分组聚集

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

达梦数据库的执行计划解读_执行计划_07

对应T1表上的C1列上有索引,因此是有序的。可以通过索引提升聚合效率。

2.7 SSEK:二级索引扫描

主要作用:
SSEK:二级索引扫描即先扫描索引,再通过主键、聚集索引、rowid 等信息去扫描表。

达梦数据库的执行计划解读_执行计划_08

通过索引IDX_C1_T1完成过滤,扫描满足条件C1=10的数据。

2.8 BLKUP:二次扫描 (回表)

主要作用:
BLKUP2:二次扫描 (回表)。访问索引后,再去表中查找其余列数据。

达梦数据库的执行计划解读_执行计划_09

通过索引IDX_C1_T1完成过滤,扫描满足条件C1=10的数据。之后回表获取所有列数据。

2.9 CSCN:全表扫描

主要作用:
CSCN2:全表扫描,CLUSTER INDEX SCAN

达梦数据库的执行计划解读_执行计划_10


无法使用索引时,会通过全表扫描访问数据。也可以理解为聚集索引全扫描。

2.10 SSCN:索引全扫描

主要作用:
SSCN:索引全扫描,只需要扫描索引,不需要扫描表。

达梦数据库的执行计划解读_执行计划_11


通过扫描索引全部叶子节点,即可返回数据,不需要扫描表的情况。

2.11 NEST LOOP:嵌套循环连接

主要作用:
NEST LOOP:嵌套循环连接,NLI2。根据驱动表返回行数,循环访问被驱动表并返回关联结果数据。

达梦数据库的执行计划解读_执行计划_12

嵌套循环连接时,会根据驱动表返回行数。来确定被驱动表的访问次数。

2.12 HASH JOIN:哈希连接

主要作用:
HASH JOIN:哈希连接。当关联条件没有索引时,两个表关联通常都会采用HASH关联。

达梦数据库的执行计划解读_达梦_13


HASH关联的好处是驱动表和被驱动表只会访问一次。

2.13 MERGE JOIN:排序合并连接

主要作用:
MERGE JOIN:排序合并连接需要两张表的连接列都有索引,对两张表扫描索引后按照索引顺序进行关联。

达梦数据库的执行计划解读_执行计划_14

通常需要两张表的关联列均有索引才能完成排序合并连接,因为索引能保证关联列是有序的。

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,动态参数(会话级)

达梦数据库的执行计划解读_执行计划_15

3.1 通过ET查看SQL真实执行计划

1.首先开启ET监控:

达梦数据库的执行计划解读_执行计划_16

2.执行查询获取SQL的执行号:

select * from sqm.t1 inner join sqm.t2 on t1.c1=t2.c1 where t1.c2='A';

达梦数据库的执行计划解读_达梦_17

3.查看详细的执行计划:

CALL ET(875933405);

达梦数据库的执行计划解读_执行计划_18

主要能输出如下列信息:

OP:操作符。
TIME(US):时间开销,单位为微秒
PERCENT:执行时间占总时间百分比。一般用于定位执行计划中的耗时步骤。
RANK:执行时间的耗时排序
SEQ:执行计划的节点号。用于结合EXPLAIN对比当前节点步骤。
N_ENTER:进入次数

3.2 利用ET优化耗时步骤

通过ET生成的真实执行计划,一般需要结合EXPLAIN生成的执行计划树,理解耗时步骤的原因,并进行分析优化。如上例中的语句。

分别通过EXPLAIN及ET获取执行计划树和耗时步骤。

达梦数据库的执行计划解读_执行计划_19


T1和T2表通过嵌套循环关联。

达梦数据库的执行计划解读_执行计划_20


通过耗时步骤分析,主要耗时就发生在第七步骤中的全表扫描部分。由于是嵌套循环关联,被驱动表T2会访问多次,造成执行耗时。

SELECT TABLE_OWNER as "模式名",
       TABLE_NAME  as "表名",
       COLUMN_NAME as "列名",
       INDEX_NAME  as "索引名"
  from DBA_IND_COLUMNS
 WHERE TABLE_OWNER = 'SQM';

达梦数据库的执行计划解读_达梦_21


由于当前仅有T1表有关联列C1索引。T2表的关联列无索引,造成多次的嵌套循环关联造成执行效率较低。为了优化耗时步骤T2表的访问。需要对T2的关联列C1创建索引。

create index idx_c1_t2 ON t2(c1);

调整后重新查看执行计划:

达梦数据库的执行计划解读_执行计划_22

对应T2表已经由全表扫描变为索引扫描,同时观察整个嵌套循环步骤的COST值。由原有的17862下降到3。也说明整个嵌套循环步骤有了较大程度的性能提升。

再结合真实的执行计划对比:

达梦数据库的执行计划解读_执行计划_23


执行时间由74ms下降到7ms。

达梦数据库的执行计划解读_达梦_24


原有的第七步骤(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

相关文章

  • openGauss数据库tpcc测试
     建表语句CREATETABLESPACEexample2relativelocation'tablespace2';CREATETABLESPACEexample3relativelocation'tablespace3';createtablebmsql_config(cfg_namevarchar(30),cfg_valuevarchar(50));createtablebmsql_wa......
  • 数据库重构之路,以 OrientDB 到 NebulaGraph 为例
    “本文由社区用户@阿七从第一视角讲述其团队重构图数据库的过程,首发于阿七公众号「浅谈架构」”原文出处:https://mp.weixin.qq.com/s/WIJNq-nuuAGtMjYo5rPLyg一、写在前面读过我公众号文章的同学都知道,我做过很多次重构,可以说是“重构钉子户”,但是这次,重构图数据库OrientDB......
  • 数据库三大范式
    面试又双叒叕被问到数据库三大范式,怎么答才能让面试官认可呢(qq.com)范式是我们设计数据库表时遵循的一种规范要求,主要有两个优点:消除重复数据减少冗余数据,从而让数据库内的数据能划分的更合理,让磁盘空间得到更有效利用的一种标准化标准;消除潜在异常(插入异常,更新异常,删除异常......
  • 如何使用Oracle Enterprise Manager Database Express连接到PDB数据库
    1.问题重复弹出登录框,无法登陆关闭登录框,显示invalidcontainername2.解决方法参考链接为PDB启动EMExpress要为PDB启动EMExpress,请确保PDB以读/写模式打开,然后尝试本主题中描述的以下方法之一(按所示顺序):连接到包含PDB的CDB的CDB$ROOT容器,并发出以下SQL......
  • AntDB数据库参加ACDU中国行杭州站,分享数据库运维实践与经验
    关于ACDU和中国行:ACDU是由墨天轮社区举办的中国数据库联盟的品牌活动之一,在线下汇集数据库领域的行业知名人士,共同探讨数据库前沿技术及其应用,促进行业发展和创新的平台,也为开发者们提供友好交流的机会。AntDB作为具有技术前瞻性的国产数据库产品,积极分享15年行业实践经验、线......
  • 首家!亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试
    近日,在中国信通院“可信数据库”数据库迁移工具专项测试中,湖南亚信安慧科技有限公司(简称:亚信安慧科技)数据库数据同步平台V2.1产品依据《数据库迁移工具能力要求》、结合亚信科技AntDB分布式关系型数据库产品,成为首款完成标准所规定的测试产品。测试过程依据标准在基础功能、数据库......
  • N天爆肝数据库——MySQL(1)
    (N天爆肝数据库——MySQL(1))链接:link这是csdn专栏链接,大家可以看一看,提提意见数据库概念理解==数据库DB存储数据的仓库数据库管理系统DBMS操纵和管理数据库的大型软件==SQL操作关系型数据库的编程语言,定义了用一套操作关系型数据库同意标准学习SQL的作用SQL是一门......
  • GaussDB技术解读系列丨运维自动驾驶探索
    本文分享自华为云社区《DTCC2023专家解读|GaussDB技术解读系列之运维自动驾驶探索》,作者:GaussDB数据库。近日,在第14届中国数据库技术大会(DTCC2023)的GaussDB“五高两易”核心技术,给世界一个更优选择专场,华为云数据库运维研发总监李东详细解读了GaussDB运维系统自动驾驶探索和实......
  • MyBatisPlus插件访问不到云数据库的解决方案
      今天在学mybatis-plus时候了解到除了MybatisX插件外还有个大佬写的MyBatisPlus插件,个人感觉他默认自动生成代码的风格会比MybatisX插件更适合中国程序员,跳转的图标也比小鸟更合适。  但是在连接云数据库的时候出了问题,发现他根本连接不到云数据库,问了其他人,他们表示自己的......
  • 缓存和数据库一致性问题
    先说结论:1、想要提高应用的性能,可以引入「缓存」来解决2、引入缓存后,需要考虑缓存和数据库一致性问题,可选的方案有:「更新数据库+更新缓存」、「更新数据库+删除缓存」3、更新数据库+更新缓存方案,在「并发」场景下无法保证缓存和数据一致性,且存在「缓存资源浪费」和「机......