一次简单的postgreSQL的SQL语句优化实际案例

文章目录

        • 业务背景
        • 初版查询SQL
          • ==这段SQL有什么问题呢==
          • 执行计划
          • 实际执行
        • 初次优化
          • 执行计划2
          • 实际执行
        • 继续优化
          • 再次优化的SQL
          • 执行计划3
          • 实际执行
        • 疑问

业务背景

我上篇文章介绍了一个规则引擎的简单使用,主要就是为了众包业务批量录入数据的一些校验的统一管理,
很快就派上了用途,需要新增一个规则

针对录入的每条数据,需要查询历史数据作为对比,看看是存在相同的数据,然后进行限制

这个需求简单分析下前提

1.批量数据录入,如果单条数据查询过长,肯定是不能接受的
2.查询数据所需参数很多,单独为了这次查询建很多索引,不现实。
所以只能从SQL本身来进行优化
3.表的数据量大概百万级别

初版查询SQL

在这里插入图片描述

主表A,关联三个业务子表,
根据主表的一个varchar类型的字段(实际存储格式为时间,前期设计是由外部系统传入的)以及其他多个参数
进行分月查询前几个月存在相同的数据的个数,
然后进行校验

这段SQL有什么问题呢

1.子查询问题,
2.or语句问题

如下图所示
在这里插入图片描述

执行计划

通过控制台看执行计划
cost很大,有三个子查询
在这里插入图片描述

实际执行

实际更新导预发环境时,也可以看到执行时长很不理想 在50ms上下徘徊,
假如有500条数据需要校验,单独这条规则就需要25s左右的时间,
无论是技术层面还是业务层面都是不可接受的

在这里插入图片描述


SQL优化的一个重要原则就是尽量减少子查询,优先使用内连接来代替子查询

初次优化

1.使用inner join 代替子查询
2.使用union all 代替or ,注意避免使用union 会导致排序去重的消耗
第一次优化sql如下
在这里插入图片描述

执行计划2

cost明显降低
但是存在另一个问题:group by 导致排序sort,存在大量的开销
在这里插入图片描述

实际执行

可以看到在拆分掉子查询之后,sql执行耗时已经稳定在== 10ms==以下了
在这里插入图片描述

继续优化

既然第一次优化存在group by导致的sort问题
那么考虑将group by去掉(有日期限制,不存在大量需要分组的数据) 看看有没有性能的提升
还有将SQL函数去掉,在代码层面对数据进行截取去重

再次优化的SQL

在这里插入图片描述

执行计划3

可以看到cost 已经降低到极低的水平
在这里插入图片描述

实际执行

实际执行也有很大提升 在5ms左右
在这里插入图片描述

疑问

为什么PostgreSQL语句去掉Group by还有函数之后,SQL语句的执行效率提升不是很明显(10ms -> 5ms)
有猛男大手子可以评论区滴滴我
有没有可能搞到1ms

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

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

相关文章

PostgreSQL之如何进行SQL优化?

文章目录 一、明确主题二、目标三、如何进行SQL优化?3.1 pg_stat_activity系统内置活动视图视图主要字段wait_event_typestate 3.2 pg_stat_statement SQL执行统计视图3.2.1 pg_stat_statements 视图详细说明中文版(简版) 3.2.2 常见案例 Top SQL 3.3 大表的索引使用…

以防作弊,ChatGPT 遭教育部「拉黑」:师生禁用!

来源:FUTURE远见 选编:FUTURE | 远见 闵青云 CSDN(ID:CSDNnews) 文 上个月,弗曼大学哲学助理教授 Darren Hick 逮到一个用 ChatGPT 写论文的作弊者后,就感慨:「ChatGPT 太先进了&am…

ChatGPT国产化:ChatYuan元语对话大模型升级

国产自研功能对话大模型元语 ChatYuan 于 2022 年 12 月发布测试版本后,引起社会各界人士的广泛讨论,并且收到了用户的大量反馈和宝贵建议。元语智能团队已于近日对元语 ChatYuan 进行了模型效果优化和版本功能升级,现已开放内测。 &#xff…

体验联网版 ChatGPT:优点和缺点同样明显,还藏着无限可能

ChatGPT 有点像古希腊的阿喀琉斯:它很强大,却有个致命的弱点——无法联网,这注定了它只能是一个停留在 2021 年的超人。 但很快,我们将等到一个「鱼和熊掌兼得」的时刻。 通过插件集的 Web browsing 功能,ChatGPT 就…

教你写接口需求文档

作者:果果 转载已取得作者授权 一、什么是接口 百科上对接口的定义:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的…

什么是反向代理,开放的反向代理软件使用方法

什么是反向代理呢?其实,反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。 Web服务器…

反向正向代理

https://www.zhihu.com/question/36412304

宝塔反代教程

近期有网友问宝塔如何设置反向代理,小编这里介绍一种简单的操作方法,就是使用宝塔官方软件面板自带的反向代理功能来实现。首先您要先安装宝塔面板,当Nginx或LNMP环境配置完成后,便可开始设置反向代理了,下面来看下操作…

[转发]图示说明正向代理和反向代理

关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道; 此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操…

Linux宝塔面板反向代理设置教程

此方法最简单快捷,没有复杂步骤,不容易出错,即最简单,零代码、零部署的方法。 实现准备 一台服务器安装宝塔面板OpenAI官方的API_KEYChatGPT网站系统源码 ChatGPT网站系统源码,大家可以看看另一篇文章介绍&#xff…

网关V.S反向代理

简介 网关主要服务于微服务/API,偏向研发人员反向代理主要面向传统静态web应用,偏向运维而未来趋势是DevOps网关和反向代理再次融合 发展趋势 WEB1.0/2.0时代,使用前置反向代理,由运维负责 nginx,进行反向代理和负载…

反向代理

先看这张图 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一…

图解正向代理和反向代理

套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反…

代理,正向代理和反向代理

1. 代理 代理也被叫做网络代理,是一种比较特殊的网络服务,允许一个终端(通常指客户端)通过这个服务与另一个终端(通常指服务器端)进行非直接的连接。 例如:一些网关、路由器等网络设备都具备网…

反向代理,正向代理,网关

反向代理,正向代理,网关 正向代理与反向代理,正向与反向是如何区分的?反向代理在系统架构中的应用场景: 正向代理与反向代理,正向与反向是如何区分的? 正向与反向的目标是客户端,是…

2、正向代理和反向代理(正向代理(客户端),反向代理(服务器))

正向代理和反向代理(正向代理(客户端),反向代理(服务器)) 1、正向代理:(代理客户端) 说个例子(访问外网):我们的客户端先…

正向代理 / 反向代理

1. 正向代理 正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正…

chatgpt赋能python:Python中的JWT解码(Decode)

Python中的JWT解码(Decode) 什么是JWT(JSON Web Token)? JSON Web Token(JWT)是目前最流行的 Web 身份验证方案之一。JWT 是基于 JSON 的开放标准,它可以让客户端和服务器之间传递…

对接支付宝php版easysdk接口分享

在网上没有找到支付宝easysdk接口的对接详细说明,自己一步一步的摸索,其中使用chatgpt的帮助作用不少。 根据官方给的文档 需要执行composer require alipaysdk/easysdk:^2.0安装sdk。如果你的项目已经安装过其它扩展,可以先把vendor文件夹备…

记录第一次利用chatgpt 实现RSA加密解密编程

1,下载Cursor软件 2,左侧文件栏目新建一个first.java 3,在编辑区输入“//使用RSA公私钥实现JWT令牌的签名和验签”,并且连续输入两个回车(相当于调用CtrlK) AI会自动生成代码,点击“Accept al…