DM执行计划

DM执行计划

1. 引言

理解执行计划对于优化查询性能、诊断慢查询问题至关重要。本文将从基础概念入手,逐步深入探讨执行计划的各个组成部分,并通过设计用例来验证所学知识。

2. SQL 执行计划基础

SQL 执行计划是数据库引擎在执行 SQL 语句时生成的一个操作步骤的详细说明。它描述了数据库如何访问数据、如何连接表、如何过滤数据等。执行计划通常以树形结构展示,每个节点代表一个操作步骤。以如下 SQL 语句执行计划为例:
SELECT * FROM SYSOBJECTS;

1 #NSET2: [0, 1282, 396]
2 #PRJT2: [0, 1282, 396]; exp_num(17), is_atom(FALSE)
3 #CSCN2: [0, 1282, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
执行计划的每行即为一个计划节点,主要包含三部分信息:

  1. 第一部分 NEST2、PRJT2、CSCN2 为操作符及数据库具体执行了什么操作。
  2. 第二部分的三元组为该计划节点的执行代价,具体含义为[代价,记录行数,字节数]。
  3. 第三部分为操作符的补充信息。
    例如:第三个计划节点表示操作符是 CSCN2(即全表扫描),代价估算是 0 ms,扫描的记录行数是 1282 行,输出字节数是 396 个。
    各计划节点的执行顺序为:缩进越多的越先执行,同样缩进的上面的先执行,下面的后执行,上下的优先级高于内外。缩进最深的,最先执行;缩进深度相同的,先上后下。

3. 执行计划的组成

3.1 操作符(Operators)

操作符是执行计划中的基本单元,代表数据库引擎执行的一个操作。
准备测试表及数据如下:
//创建测试表
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) );

//向 T1 和 T2 中各插入了 10000 条数据,数据内容完全一致
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 的 C1 列上创建了索引 IDX_C1_T1,并初始化了索引 IDX_C1_T1 的统计信息
CREATE INDEX IDX_C1_T1 ON T1(C1);
SP_INDEX_STAT_INIT(USER,‘IDX_C1_T1’);

DM常见的操作符包括:

  1. NSET:结果集收集,是用于结果集收集的操作符,一般是查询计划的顶层节点
    在这里插入图片描述

  2. PRJT:投影,关系的【投影】 (project) 运算,用于选择表达式项的计算
    在这里插入图片描述

  3. SLCT:选择,是关系的【选择】运算,用于查询条件的过滤
    在这里插入图片描述

  4. AAGR:简单聚集,用于没有 GROUP BY 的 COUNT、SUM、AGE、MAX、MIN 等聚集函数的计算
    在这里插入图片描述

  5. FAGR:快速聚集,用于没有过滤条件时,从表或索引快速获取 MAX、MIN、COUNT 值
    在这里插入图片描述

  6. HAGR:HASH 分组聚集,用于分组列没有索引只能走全表扫描的分组聚集
    在这里插入图片描述

  7. SAGR:流分组聚集,用于分组列是有序的情况下
    在这里插入图片描述

  8. BLKUP:二次扫描 (回表),先使用二级索引索引定位 rowid,再根据表的主键、聚集索引、rowid 等信息获取数据行中其它列
    在这里插入图片描述

  9. CSCN:全表扫描, CSCN2 是 CLUSTER INDEX SCAN 的缩写即通过聚集索引扫描全表
    在这里插入图片描述

  10. SSEK、CSEK、SSCN:索引扫描
    SSEK2 是二级索引扫描即先扫描索引,再通过主键、聚集索引、rowid 等信息去扫描表。
    在这里插入图片描述

CSEK2 是聚集索引扫描只需要扫描索引,不需要扫描表,即无需 BLKUP 操作
– 创建所需索引
CREATE CLUSTER INDEX IDX_C1_T2 ON T2(C1);
CREATE INDEX IDX_C1_C2_T1 ON T1(C1,C2);
在这里插入图片描述

SSCN 是索引全扫描,不需要扫描表。
在这里插入图片描述

  1. NEST LOOP:嵌套循环连接
    //强制优化器使用嵌套循环连接
    select /+use_nl(t1,t2)/* from t1 inner join t2 on t1.c1=t2.c1 where t1.c2=‘A’;
    (由于没有索引,执行效率会很差)
    在这里插入图片描述

改进:针对 T1 和 T2 的连接列创建索引,并收集统计信息
//T2的索引在前面已创建
CREATE INDEX IDX_T1_C2 ON T1(C2);
DBMS_STATS.GATHER_INDEX_STATS(USER,‘IDX_T1_C2’);
DBMS_STATS.GATHER_INDEX_STATS(USER,‘IDX_C1_T2’);
在这里插入图片描述

查看执行计划可看出效率明显改善,代价有显著下降

  1. HASH JOIN:哈希连接是在没有索引或索引无法使用情况下大多数连接的处理方式
    将T1和T2的索引删除
    在这里插入图片描述

  2. MERGE JOIN:归并排序连接,连接需要两张表的连接列都有索引,对两张表扫描索引后按照索引顺序进行归并
    CREATE INDEX IDX_T1_C1C2 ON T1(C1,C2);
    CREATE INDEX IDX_T2_C1C2 ON T2(C1,C2);
    select /+use_merge(t1 t2)/t1.c1,t2.c1 from t1 inner join t2 on t1.c1=t2.c1 where t2.c2=‘b’;
    在这里插入图片描述

3.2 成本(Cost)

成本是数据库引擎对执行计划中每个操作符的资源消耗的估计。成本通常包括 CPU 成本、I/O 成本等。成本越低,执行计划的效率越高。

3.3 行数估计(Row Estimation)

行数估计是数据库引擎对每个操作符返回的行数的估计。准确的估计有助于优化查询性能。

3.4 访问路径(Access Path)

访问路径描述了数据库引擎如何访问表中的数据。常见的访问路径包括:

  • 全表扫描(Full Table Scan): 扫描整个表。
  • 索引扫描(Index Scan): 通过索引访问数据。
  • 索引查找(Index Seek): 通过索引查找特定行。

4. 执行计划的优化

4.1 索引的使用

索引是优化查询性能的重要手段。通过创建合适的索引,可以显著减少查询的响应时间。常见的索引类型包括:

  • 单列索引
  • 复合索引
  • 唯一索引
  • 覆盖索引

4.2 连接策略(Join Strategies)

连接策略是数据库引擎在执行连接操作时选择的算法。常见的连接策略包括:

  • Nested Loop Join : 适用于小表连接。
  • Hash Join : 适用于大表连接。
  • Merge Join : 适用于已排序的表连接。

4.3 子查询优化

子查询是 SQL 查询中常见的操作,但不当使用子查询可能导致性能问题。优化子查询的方法包括:

  • 将子查询转换为连接操作。
  • 使用 EXISTS 替代 IN
  • 使用 WITH 子句(CTE)优化复杂子查询。

4.4 统计信息的更新

统计信息是数据库引擎优化查询的重要依据。统计信息包括表的行数、列的分布情况等。定期更新统计信息有助于数据库引擎生成更优的执行计划。

5. 设计用例验证

准备测试表和数据
//清除测试表
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) );

//向 T1 和 T2 中各插入了 10000 条数据,数据内容完全一致
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;
5.1 简单查询(全表扫描 vs 索引扫描)

EXPLAIN PLAN FOR
SELECT * FROM T1 WHERE C1 = 100;

全表扫描
在这里插入图片描述

索引扫描
CREATE INDEX IDX_T1_C1 ON T1(C1);
在这里插入图片描述

对比访问计划可以发现,使用索引 IDX_T1_C1 进行索引查找,成本较低,形成的结果集较小。
5.2 连接查询(嵌套循环连接 vs 哈希连接)
//两表单独建索引
CREATE INDEX IDX_T1_C1 ON T1(C1);
CREATE INDEX IDX_T1_C2 ON T1(C2);
CREATE INDEX IDX_T2_C1 ON T2(C1);
CREATE INDEX IDX_T2_C2 ON T2(C2);

SP_INDEX_STAT_INIT(USER,‘IDX_T1_C1’);
SP_INDEX_STAT_INIT(USER,‘IDX_T1_C2’);
SP_INDEX_STAT_INIT(USER,‘IDX_T2_C1’);
SP_INDEX_STAT_INIT(USER,‘IDX_T2_C2’);

嵌套循环连接(执行9ms)
EXPLAIN
SELECT /*+ USE_NL(T1, T2) */ *
FROM T1
INNER JOIN T2 ON T1.C1 = T2.C1
WHERE T1.C2 = ‘A’;
在这里插入图片描述

哈希连接(执行2ms)
EXPLAIN
SELECT /*+ USE_HASH(T1, T2) */ *
FROM T1
INNER JOIN T2 ON T1.C1 = T2.C1
WHERE T1.C2 = ‘A’;
在这里插入图片描述

其中,嵌套循环连接耗时9毫秒比哈希连接耗时2毫秒长,因为嵌套循环里驱动表的行数就是循环的次数,在很大程度上影响执行效率。

6. 总结与建议

理解 SQL 执行计划是优化查询性能的关键。通过分析执行计划,我们可以识别查询中的性能瓶颈,并采取相应的优化措施。建议在实际工作中:

  • 定期分析慢查询的执行计划。
  • 创建合适的索引。
  • 更新统计信息。
  • 避免不必要的子查询和临时表。

更多详细资料可前往达梦社区:https://eco.dameng.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)

目录​​​​​​​ 1 简介 1.1 使用场景 1.2 能力范围 1.3 业务流程 1.4 通知样式 1.5 约束限制 1.6 与相关Kit的关系 2 请求通知授权 2.1 接口说明 2.2 开发步骤 3 管理通知角标 3.1 接口说明 3.2 开发步骤 4 管理通知渠道 4.1 通知渠道类型说明 4.2 接口说明…

SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问

一、前言 SSL协议介于TCP/IP协议栈的第四层&#xff08;传输层&#xff09;和第七层&#xff08;应用层&#xff09;之间&#xff0c;为基于TCP的应用层协议&#xff08;如HTTP&#xff09;提供安全连接。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传…

【数学】数论干货(疑似密码学基础)

文章目录 前言一. 整除、算术基本定理、同余、同余类、剩余系的基本定义1.整除2.算数基本定理3.同余4.同余类&#xff08;也叫剩余类&#xff09;5.剩余系 二. 费马小定理的内容及其证明1.费马小定理基本内容2.费马小定理的证明&#xff08;interesting 版&#xff09; 三. 欧拉…

[实现Rpc] 消息抽象层的具体实现

目录 具象层 _ 消息抽象的实现 信息的抽象类 实现 JsonMessage JsonRequest & JsonResponse 消息-不同消息分装实现 实现 Request RpcRequest TopicRequest ServiceRequest Response RpcResponse TopicResponse ServiceResponse 实现 生产工厂 本篇文章继 …

《A++ 敏捷开发》- 16 评审与结对编程

客户&#xff1a;我们的客户以银行为主&#xff0c;他们很注重质量&#xff0c;所以一直很注重评审。他们对需求评审、代码走查等也很赞同&#xff0c;也能找到缺陷&#xff0c;对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。 我&#xff1a;你听说过敏捷的结对…

PHP房屋出租出售高效预约系统小程序源码

&#x1f3e0; 房屋出租出售高效预约系统 —— 您的智能找房新选择 &#x1f4a1; 这是一款集智慧与匠心于一体的房屋出租出售预约系统&#xff0c;它巧妙地融合了ThinkPHP与Uniapp两大先进框架&#xff0c;精心打造而成。无论是小程序、H5网页&#xff0c;还是APP端&#xff…

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天&#xff0c;类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而&#xff0c;在我们的代码世界里&#xff0c;仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时&#xff0c;架构可能岌…

Repeated Sequence

记suma[1]a[2]a[3]...a[n]。 该序列以a[1]&#xff0c;a[2]&#xff0c;a[3]....a[n]为循环节&#xff0c;明显的&#xff0c;问题可转化为:s%sum是否为该序列的某个连续子序列和。 断环为链。将a复制一份。 枚举a[i]为左端点的所有区间的和。再查找s是否存在。二分O&#x…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介&#xff1a;Ollama 是一个强大的开源框架&#xff0c;是一个为本地运行大型语言模型而设计的工具&#xff0c;它帮助用户快速在本地运行大模型&#xff0c;通过简单的安装指令&#xff0c;可以让用户执行一条命令就在本地运…

dockerfile 使用环境变量

ARG&#xff1a; Defining build-time variables ARG指令允许您定义在构建阶段可以访问但在构建映像之后不可用的变量。例如&#xff0c;我们将使用这个Dockerfile来构建一个映像&#xff0c;我们在构建过程中使用ARG指令指定的变量。 FROM ubuntu:latest ARG THEARG"fo…

基于WebGIS技术的校园地图导航系统架构与核心功能设计

本文专为IT技术人员、地理信息系统&#xff08;GIS&#xff09;开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案&#xff0c;旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

【从0做项目】Java音缘心动(3)———加密算法 MD5 BCrypt

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;项目结果展示 一&#xff1a;音乐播放器Web网页介绍 二&#xff1a;加密算法介绍 1&…

新数据结构(12)——代理

什么是代理 在进行操作时有时不希望用户直接接触到目标&#xff0c;这时需要使用代理让用户间接接触到目标 给目标对象提供一个代理对象&#xff0c;并且由代理对象控制着对目标对象的引用 图解&#xff1a; 代理的目的 控制访问&#xff1a;通过代理对象的方式间接的访问目…

基于大语言模型的推荐系统(1)

推荐系统&#xff08;recommendation system&#xff09;非常重要。事实上&#xff0c;搜索引擎&#xff0c;电子商务&#xff0c;视频&#xff0c;音乐平台&#xff0c;社交网络等等&#xff0c;几乎所有互联网应用的核心就是向用户推荐内容&#xff0c;商品&#xff0c;电影&…

学习threejs,使用MeshBasicMaterial基本网格材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshBasicMaterial 二…

Selenium实战案例2:东方财富网股吧评论爬取

上一篇文章&#xff0c;我们使用Selenium完成了网页内文件的自动下载,本文我们将使用Selenium来爬取东方财富网股吧内笔记的评论数据。 网页内容分析 网页内容的分析是web自动化中的关键一步。通过分析网页结构&#xff0c;我们可以确定需要抓取的数据位置以及操作元素的方式。…

零基础学python--------第三节:Python的流程控制语法

Python&#xff0c;浮点数 11.345(单&#xff1a;4个字节&#xff0c; 双&#xff1a;8个字节) 。 十进制的数字25 ---> 11001 讲一个小数转化为二进制&#xff1a; 不断的乘以2 。取整数部分。 十进制的0.625 ----> 二进制&#xff1a; 0&#xff0c; 101 。 0.3 ---…

MKS SERVO42E57E 闭环步进电机_系列10 STM32_脉冲和串口例程

文章目录 第1部分 产品介绍第2部分 相关资料下载2.1 MKS E系列闭环步进驱动资料2.2 源代码下载2.3 上位机下载 第3部分 脉冲控制电机运行示例第4部分 读取参数示例4.1 读取电机实时位置4.2 读取电机实时转速4.3 读取电机输入脉冲数4.4 读取电机位置误差4.5 读取电机IO端口状态 …

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器&#xff0c;想安装 OpenWRT 或者 安装 Clash 使用&#xff0c;看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了&#xff0c;一直黄灯亮&#xff0c;中间灭一下&#xff0c;又是黄灯长亮&#xff0c;没有 WIFI 没有连接。以…