当前位置: 首页 > news >正文

使用SQLark分析达梦慢SQL执行计划的一次实践

最近刚参加完达梦的 DCP 培训与考试,正好业务系统有个 sql 查询较慢,就想着练练手。

在深入了解达梦的过程中,发现达梦新出了一款叫 SQLark 百灵连接的工具。

我首先去官网大致浏览了下。虽然 SQLark 在功能深度上不如 DM Manager 和 PL/SQL,但常用的基础功能都有,还能很好的兼容 DM 和 Oracle,满足我的日常使用需求。

SQLark 工具里有个“执行计划分析模式”的功能,很适合用于分析我的慢 SQL(不用我粘贴到 Notepad++ 里分析)。

在这里我记录下学习达梦执行计划,并分析的过程。

👉 前往SQLark官网:www.sqlark.com 注册永久免费!

业务场景

软件控制硬件设备,处理一个作业任务,一个作业任务对应plc_rin表的一条记录。

plc_rin_temp表记录的是该硬件做任务期间的温度监控信息。温度是每隔3秒采集一次。

所以plc_rin与plc_rin_temp是一对多的关系。

业务场景

plc_rin.id = plc_rin_temp.rin_id

关联关系

大致说下业务的sql实现:

先对任务id进行分组,获取plc_rin_temp表每个rin_id的最新的一条数据。

然后join关联,获取到每个rin_id的最新采集的两条记录(每次采集,不同模块的采集时间是一致的)

最后任务表plc_rin左连接上面的结果集。

selectp."rin_user_name",p."start_time",p."end_time",p."rin_wheel_num",a.*from"plc_rin" pleft join (selectt1.*from"plc_rin_temp" t1inner join (selectmax("temp_minute") as "temp_minute","rin_id"from"plc_rin_temp"group by"rin_id") t2 on t1."temp_minute" = t2."temp_minute"and t1."rin_id" = t2."rin_id") a on p."id" = a."rin_id"
wherep."id" in ('44dc5165-93f8-4418-8407-245f1f94b192','5ea6b18c-f7c0-400f-a33e-1b778299d163'
);

查询结果大概就是这样的:每个rin_id对应两条最新的温度采集数据。

1.jpg

SQL慢问题

当plc_rin和plc_rin_temp数据量越来越多后,该sql的执行效率就越低,甚至好几秒才能加载出来。对于当前我这种对数据库优化研究不深的开发人员来说,这是一次很好的机会,从一个DBA的角度来优化sql。

执行计划分析

1. 什么是执行计划

在数据库管理中,执行计划是查询优化器根据查询语句的结构和表的统计信息生成的一种操作指南,用于指导数据库引擎执行查询操作。它描述了数据库引擎如何访问表、使用索引、连接表以及进行其他操作来获取查询结果。

简单点说,执行计划是 SQL 语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。

通过执行计划,可以了解查询的执行过程,找出性能瓶颈,从而进行优化。

2. 如何查看执行计划

使用 EXPLAIN 可以打印出语句的执行计划。
或者直接点击【执行计划】按钮。

2.jpg

一开始不理解这些字符和数字分别代表什么,可以切换为表格形式:

3.jpg

3. 执行计划分析模式

进入执行计划分析模式,可以更好的查看和分析执行计划信息。

4.jpg

因为默认没有展示附加信息,我们可以勾选是否展示。这点挺人性化的,因为有时候分析的时候其实并不希望太多的信息,很多信息会干扰查看。

5.jpg

4. 如何分析执行计划

1)执行计划操作符

列出几个我们执行计划中出现的操作符,也是比较常见的操作符。

编组 21.jpg

想看所有操作符,可以去官方网站:

https://eco.dameng.com/document/dm/zh-cn/pm/dm8-admin-manual-appendix4.html

2)执行计划顺序

缩进越多的越先执行,同样缩进的上面的先执行,下面的后执行,上下的优先级高于内外。

PS: 希望SQLark工具的后续版本,能提供查看执行计划的顺序

剧透:查看执行计划顺序的功能将在下个版本上线~

3)执行计划代价

每个操作符后面会有一个三元组。例如CSCN2: [1, 3960, 56]。

[1, 3960, 56]就是一个三元组,其中 3 个数字分别表示该操作符的估算代价、输出结果集和行数据处理长度。

分析结论

因为这是做的本地测试,所以数据量不多。plc_rin表有50条记录,plc_rin_temp有3960条记录。

从执行计划中的CSCN2: [1, 3960, 56]上可以看出,我的sql查询,是做了全表扫描的,而且因为join的原因,做了两次。

6.jpg

搜索执行计划中是否含 CSCN 操作符

由于业务关系和我的水平限制,尝试过对sql进行改写优化,但都不大理想,例如下面这种:

将过滤条件下推

selectp."rin_user_name",p."start_time",p."end_time",p."rin_wheel_num",a."temp_type",a."temp_start",a."temp_bearing",a."temp_rise",a."temp_minute",a."rin_id"
from"plc_rin" pleft join (selectt1.*from"plc_rin_temp" t1inner join (selectmax("temp_minute") as "temp_minute","rin_id"from"plc_rin_temp"where"rin_id" in ('44dc5165-93f8-4418-8407-245f1f94b192','5ea6b18c-f7c0-400f-a33e-1b778299d163','fa09591c-db5b-4497-8c78-51615b12179d','74e03635-c912-433f-a00f-b76c5c9aa4df','062302b8-13c8-4412-a43a-35d5ef740a43','5317ea2f-c6bf-482b-989e-c8a78bb6ece5')group by"rin_id") t2 on t1."temp_minute" = t2."temp_minute"and t1."rin_id" = t2."rin_id") a on p."id" = a."rin_id"
;

执行计划是这样的:

7.jpg

发现改写后,反而代价更高了。只能考虑其他优化方式。

因为plc_rin_temp表会频繁插入数据,所以也不建议创建索引。当前有两种方式:

  • 就是利用触发器,将需要的数据提取出来,存入另一张表中。

  • 就是做分表,因为业务关系,基本当天的任务当天就处理完了,处理完的数据基本就是历史数据了,不会处理了。我们可以将plc_rin_temp分为两个表,一个当前数据表,一个历史数据表。当前数据表的数据处理完后将数据转入历史数据表。

我自己比较倾向于第二种方式。如果大家有更好的方式,敬请指教,先谢为敬!

👉 前往SQLark官网:www.sqlark.com 免费下载体验!

相关文章:

使用SQLark分析达梦慢SQL执行计划的一次实践

最近刚参加完达梦的 DCP 培训与考试,正好业务系统有个 sql 查询较慢,就想着练练手。 在深入了解达梦的过程中,发现达梦新出了一款叫 SQLark 百灵连接的工具。 我首先去官网大致浏览了下。虽然 SQLark 在功能深度上不如 DM Manager 和 PL/SQ…...

【人工智能】用Python构建高效的自动化数据标注工具:从理论到实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 数据标注是构建高质量机器学习模型的关键环节,但其耗时耗力常成为制约因素。本篇文章将介绍如何用Python构建一个自动化数据标注工具,结合机器学习和NLP技术,帮助加速数据标注过程。我们将从需求分析入…...

Java --- 注解(Annotation)

一.什么是注解? 在Java中,注解(Annotation)是一种元数据(metadata),它为程序中的类、方法、字段等提供额外的描述信息。注解本身不直接改变程序的行为,但可以被编译器、开发工具、框…...

nodejs作为provider接入nacos

需求:公司产品一直是nodejs的后台,采用的eggjs框架,也不是最新版本,现有有需求需求将这些应用集成到微服务的注册中心,领导要求用java。 思路:用spring cloud gateway将需要暴露的接口url转发,…...

SpringBoot3+Micormeter监控应用指标

监控内容简介 SpringBoot3项目监控服务 ,可以使用Micormeter度量指标库,帮助我们监控应用程序的度量指标,并将其发送到Prometheus中并用Grafana展示。监控指标有系统负载、内存使用情况、应用程序的响应时间、吞吐量、错误率等。 micromete…...

Mybatis-plus 简单使用,mybatis-plus 分页模糊查询报500 的错

一、mybtis-plus配置下载 MyBatis-Plus 是一个 Mybatis 增强版工具&#xff0c;在 MyBatis 上扩充了其他功能没有改变其基本功能&#xff0c;为了简化开发提交效率而存在。 具体的介绍请参见官方文档。 官网文档地址&#xff1a;mybatis-plus 添加mybatis-plus依赖 <depe…...

2022 年 12 月青少年软编等考 C 语言三级真题解析

目录 T1. 鸡兔同笼思路分析T2. 猴子吃桃思路分析T3. 括号匹配问题T4. 上台阶思路分析T5. 田忌赛马T1. 鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有 2 2 2 只脚,兔子有 4 4 4 只脚,没有例外)。已经知道了笼子里面脚的总数 a a a,问笼子里面至少有多少只动物,至多有多少只…...

webpack 题目

文章目录 webpack 中 chunkHash 和 contentHash 的区别loader和plugin的区别&#xff1f;webpack 处理 image 是用哪个 loader&#xff0c;限制 image 大小的是...&#xff1b;webpack 如何优化打包速度 webpack 中 chunkHash 和 contentHash 的区别 主要从四方面来讲一下区别&…...

【MySQL】视图详解

视图详解 一、视图的概念二、视图的常用操作2.1创建视图2.2查询视图2.3修改视图2.4 删除视图2.5向视图中插入数据 三、视图的检查选项3.1 cascaded&#xff08;级联 &#xff09;3.2 local(本地) 四、视图的作用 一、视图的概念 视图&#xff08;View&#xff09;是一种虚拟存…...

第一节:ORIN NX介绍与基于sdkmanager的镜像烧录(包含ubuntu文件系统/CUDA/OpenCV/cudnn/TensorRT)

ORIN NX技术参数 Orin NX版本对比 如上图所示,ORIN NX官方发布的版本有两个版本一个版本是70TOPS算力,DDR为8GB的版本低配版本,一个是100TOPS算法,DDR为16GB的高配版本。 Orin NX的外设框图 两个版本除了GPU和DDR的差距外,外设基本上没有区别,丰富的外设接口,后续开发…...

2024-12-04OpenCV视频处理基础

OpenCV视频处理基础 OpenCV的视频教学&#xff1a;https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV视频捕获 在 OpenCV 中&#xff0c;cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频&#xff0c;或者从视频文件中读取帧。以下是如何使用…...

D89【python 接口自动化学习】- pytest基础用法

day89 pytest的setup&#xff0c;setdown详解 学习日期&#xff1a;20241205 学习目标&#xff1a;pytest基础用法 -- pytest的setup&#xff0c;setdown详解 学习笔记&#xff1a; setup、teardown详解 模块级 setup_module/teardown_module 开始于模块始末&#xff0c;生…...

七、docker registry

七、docker registry 7.1 了解Docker Registry 7.1.1 介绍 registry 用于保存docker 镜像&#xff0c;包括镜像的层次结构和元数据。启动容器时&#xff0c;docker daemon会试图从本地获取相关的镜像&#xff1b;本地镜像不存在时&#xff0c;其将从registry中下载该镜像并保…...

FlightGear+MATLAB+飞行手柄实现实时飞控视景系统

文章目录 一、软件配置二、FlightGearMATLAB联合仿真第一步 复制文件第二步 新建文件夹第三步 打开demo第四步 demo说明第五步 打开Simulink第六步 连接FlightGear第七步 设置FlightGear第八步 生成FlightGear连接文件FlightGear的设置Network的设置File的设置生成.bat文件 第九…...

深入 Java 基础 XML:高级特性与最佳实践

在上一篇文章中&#xff0c;我们对 Java 基础 XML 有了一个初步的认识&#xff0c;了解了 XML 的基本结构以及在 Java 中常见的解析方式。今天&#xff0c;我们将进一步深入探讨 Java 与 XML 的结合&#xff0c;包括一些高级特性和最佳实践。 一、XML 命名空间 在复杂的 XML …...

【论文阅读】Fifty Years of the ISCA: A Data-Driven Retrospective

学习体会&#xff1a; ISCA会议近五十年文章分析, 了解论文热点方向, 处理器依旧是热点! AI和并行是大趋势, 做XPU相关目前来说还是热点~ 摘录自原文 摘录: 数据来源和分析方法&#xff1a; 作者收集了 ACM 数字图书馆中所有 ISCA 论文&#xff0c;并使用 DBLP、Google Schol…...

TVbox源贡献指南

欢迎各路大佬踊跃提PR&#xff0c;分享爬虫代码。 源码仓库地址 https://github.com/lushunming/AndroidCatVodSpider 快速开始 本工程是一个完整的AndroidStudio工程&#xff0c;请你用AS打开编辑。 工程调试完毕后要需要导出生成jar文件配合软件使用&#xff0c;执行根目…...

qt数据类型定义(包含签名)

先推荐一个处理markdown表格的网站&#xff0c;超级好用&#xff1a;markdown表格处理&#xff0c;我就是用这个表格处理的excel中的数据上传。 下表整理了数据类型的值范围、签名、qt如何定义等内容。 类型范围/子类型dbus签名qt支持的签名qt类型定义方式转换为variantint8(…...

docker逃逸总结

一、 检查是否在docker容器中 通过以下两个地方来判断 # 是否存在此文件 ls -al /.dockerenv# 在其中是否包含docker字符串 cat /proc/1/cgroup除了上面两种外还有其他方式判断&#xff0c;如检测mount、fdisk -l查看硬盘 、判断PID 1的进程名等也可用来辅助判断。 容器逃逸…...

MySql:表的操作

目录 创建表 查看创建表时的信息 查看表的结构描述 删除一张表 修改表 创建表 CREATE TABLE [IF NOT EXISTS] table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...