使用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 免费下载体验!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive分区值的插入

对于Hive分区表,在我们插入数据的时候需要指定对应的分区值,而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致,或者提供的分区值是NULL的情况,下面我们依次来展现下不同情况下的表现…

云计算vspere 安装过程

1 材料的准备 1 安装虚拟机 vmware workstation 2 安装esxi 主机 3 在esxi 主机上安装windows 2018 dns 服务器 4 在虚拟机上安装windows 2018 服务器 6 安装vcenter 5 登入界面测试 这里讲一下,由于部署vspere 需要在windows 2012 服务器上部…

【0x0001】HCI_Inquiry命令详解

目录 一、命令概述 1.1. 返回事件说明 1.2. 设备报告规则 二、命令格式及参数 2.1. HCI_Inquiry命令格式 2.2. LAP参数 2.3. Inquiry_Length 2.4. Num_Responses 三、响应事件 3.1. HCI_Command_Status 事件 3.2. HCI_Inquiry_Result, HCI_Inquiry_Result_with_RSSI…

五.指派问题

匈牙利发求解指派问题找独立0元素,常用的步骤为:

2024蜀道山高校联合公益赛

mixian 数组越界,可以去攻击stdout泄露libc,之后伪随机数绕过 from pwn import* from struct import pack import ctypes #from LibcSearcher import * from ae64 import AE64 def bug():gdb.attach(p)pause() def s(a):p.send(a) def sa(a,b):p.sendaf…

【若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤

🎙告诉你:Java是世界上最美好的语言 💎比较擅长的领域:前端开发 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持续下去的动力! 目录 一. 作者有话说 …

Python毕业设计选题:基于大数据的旅游景区推荐系统_django

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 景点信息界面 景点资讯界面 个人中心界面 …

Endnote 参考文献内容没有按引用顺序进行排序

Endnote 参考文献内容没有按引用顺序进行排序: word论文正文第一个引用就是[4]打头,疯狂卸载重装,修改设置,排查了大半天,最后解决了。 常规解决方案 就是在Endnote 软件里面对outputstyle进行修改,将Biogr…

图像滤波和卷积的不同及MATLAB应用实例

滤波与卷积在图像处理中都是非常重要的运算,但它们有着明显的区别。以下是滤波与卷积的主要不同点,并附带一个MATLAB实例来展示两者在图像处理中的效果差异。 一、滤波与卷积的不同 定义与目的: 1)滤波:滤波是一种信…

低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构(HCIP-Cloud Service Solution Architect)证书, 特意在淘宝上买了题库, 考过了。 事后得知自己被坑了, 多花了几十大洋。 所以想着在授权期内将题库“爬”下来, 共享给大家。 因为整个过程蛮有…

Scala—Sliding(滑动窗口)用法详解

Scala—Sliding(滑动窗口)用法详解 Scala 的 sliding 方法在处理集合时,可以方便地获取一个集合的“滑动窗口”(能够按照指定的窗口大小和步长从集合中获取子集合)。 sliding 方法定义: def sliding(size…

一、理论基础-PSI

之前参加了隐语第2期,对隐语SecretFlow框架有了大致的了解,这次参加隐语第4期,学习下PSI和PIR。 一、PSI定义 首先介绍PSI的定义,PSI(隐私集合求交,Private Set Intersection即PSI)是安全多方计算&#x…

11.15【JAVA】【网络编程】【DEBUG】

代码以开源至cqujk/CquJavaEE 的myExp-socketCode分支,欢迎拷打 参考REPO Java 11: Standardized HTTP Client API 没反应 这是因为这应当是两个线程,当server创建好套接字后,进入accept时,就不会继续向下运行,客户端自然也就无法发送请求 首先要保证server进入accept(这个…

国家信息中心单志广:智慧城市转型中的数据要素价值释放

今日,由中国电信集团主办的2024数字科技生态大会数据要素合作论坛在广州市举办。国家发改委国家信息中心信息化和产业发展部主任单志广在论坛发展主旨演讲:智慧城市转型中的数据要素价值释放,主要包括发展新形势、数据新要素、数据新产权、数…

RTSP摄像头8K超高清使用场景探究和播放器要求

技术背景 8K 分辨率拥有7680x4320像素,像素数量是4K的四倍、1080P 的16倍。这意味着它能够呈现出极其清晰、细腻的图像,观众可以看到更多的细节,比如在体育赛事直播中,运动员的表情、动作细节,赛场上的微小标识等都能…

SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试

Mock概念 Mock叫做模拟对象,即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为(例如返回值或抛出异常),从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖,spring-boot-start…

车机端同步outlook日历

最近在开发一个车机上的日历助手,其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现,毕竟手机日历是手机厂商自己带的系统应用,根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后,交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中,I/O多路复用是一种技术,它允许单个线程处理多个输入/输出&…

电商产品自动化测试实战—解锁高效测试新技能

在这个数字化时代,电子商务行业的竞争愈发激烈,产品品质和稳定性成为了企业赢得市场的关键。而高质量的测试工作,正是确保产品品质和稳定性的重要保障。为此,我们特别推出了一场电商产品自动化测试实战公开课,旨在帮助…

【JavaWeb后端学习笔记】Mybatis基础操作以及动态SQL(增、删、改、查)

Mybatis 0、环境准备0.1 准备数据库表emp;0.2 准备SpringBoot工程0.3 配置文件中引入数据库连接信息0.4 创建对应的实体类0.5 准备Mapper接口 1、MyBatis基础操作1.1 删除1.2 新增(主键返回)1.3 更新1.4 查询(解决字段名与类属性名…