教你使用逻辑公式和恒等式等价改写SQL
今天同事给我一条2秒的SQL看看能不能优化。
原始SQL:
SELECT pk_dept
FROM aaaa
WHERE 1 = 1
AND ((pk_group = '0001A110000000000JQ6' AND pk_org IN ('0001A110000000001M09')))
AND (PK_DEPT IN (SELECT t1.ORGID
FROM xxxxx t1
INNER JOIN (SELECT (CASE WHEN ORGID3 IS NULL THEN ORGID2 ELSE ORGID3 END) orgid
FROM xxxxx
WHERE ORGID = '1001A110000000001U8S') t2
ON t1.ORGID2 = t2.orgid OR t1.ORGID3 = t2.orgid))
AND (enablestate IN (2))
ORDER BY code;
4 loops=1)
Heap Fetches: 0
Planning Time: 258.024 ms
Execution Time: 2493.882 ms
(1583 rows)
xxxxx 表是一张非常复杂的视图,上面SQL执行计划大概2千行左右,所以本案例就不放整体的计划了。
如果经常做优化的同学对于简单的SQL,相信可以使用瞪眼大法基本定位到语句慢的位置
子查询慢SQL:
SELECT t1.ORGID
FROM xxxxx t1
INNER JOIN (SELECT (CASE WHEN ORGID3 IS NULL THEN ORGID2 ELSE ORGID3 END) orgid
FROM xxxxx
WHERE ORGID = '1001A110000000001U8S') t2
ON t1.ORGID2 = t2.orgid OR t1.ORGID3 = t2.orgid
主要是慢在连接列的 OR 关系运算符上。
我们可以仔细看看这条SQL,xxxxx 分别作为t1、t2 表内连接关联2次, 关联条件为:t1.ORGID2 = t2.orgid OR t1.ORGID3 = t2.orgid
这种关联条件的逻辑关系可以简化为: t1.ORGID2 = t1.ORGID3
SQL语句可以进行以下精简:
SELECT t1.ORGID FROM xxxxx t1 where ORGID = '1001A110000000001U8S';
验证等价逻辑:
ncc=# SELECT t1.ORGID
ncc=# FROM xxxxx t1
ncc=# INNER JOIN
ncc=# (SELECT (CASE WHEN ORGID3 IS NULL THEN ORGID2 ELSE ORGID3 END) orgid FROM xxxxx
ncc=# WHERE ORGID = '1001A110000000001U8S') t2
ncc=# ON t1.ORGID2 = t2.orgid OR t1.ORGID3 = t2.orgid;
orgid
----------------------
1001A110000000001U8S
(1 row) ncc=# SELECT t1.ORGID FROM xxxxx t1 where ORGID = '1001A110000000001U8S';
orgid
----------------------
1001A110000000001U8S
(1 row) ncc=#
可以看到子查询SQL进行改写后是结果是等价的,使用逻辑公式进行化繁为简。
改写优化SQL后执行计划:
SELECT pk_dept
FROM org_dept
WHERE 1 = 1
AND ((pk_group = '0001A110000000000JQ6' AND pk_org IN ('0001A110000000001M09')))
AND (PK_DEPT IN (SELECT t1.ORGID
FROM EHR_ORG_DEPT t1
where ORGID = '1001A110000000001U8S')
)
AND (enablestate IN (2))
ORDER BY code;
-> Seq Scan on org_dept d1_35 (cost=0.00..639.33 rows=7133 width=116) (actual time=0.047..1.480 rows=7133 loops=1)
-> Hash (cost=120.64..120.64 rows=3224 width=21) (actual time=1.315..1.315 rows=3224 loops=1)
Buckets: 4096 Batches: 1 Memory Usage: 199kB
-> Index Only Scan using pk_bd_region on bd_region bg_35 (cost=0.28..120.64 rows=3224 width=21) (actual time=0.024..0.651 rows=3224 loops=1)
Heap Fetches: 0
Planning Time: 86.684 ms
Execution Time: 625.439 ms
2.4秒的SQL最后通过化繁为简最终优化到625毫秒就能跑出结果。
总结:逻辑思维课程还是挺重要的,建议大家有空的时候去看看。
教你使用逻辑公式和恒等式等价改写SQL的更多相关文章
- Lambda表达式Contains方法(等价于SQL语句中的like)使用注意事项
貌似已经半年多没写一篇帖子了,充分的说明要么老总一天折腾的让人心齐疲惫,没心情去写:要么另外一种可能就是自己不思进取,说白了就是懒.好在这种状态在今天被打破了.MoNey加油. 众所周知,想在Enti ...
- 逻辑很重要:一句sql语句的事,自己却想了半天,绕了个大弯子
问题:系统升级后审核认证信息分别写入两个表,现在需要链接用户表和相应的新旧审核表获取字段值? 钻进胡同里:一直纠结于升级之后的会员信息从新表查,升级之前的数据从旧表查,纠结于根据时间戳分条件判断, 其 ...
- MySQL(逻辑分层,存储引擎,sql优化,索引优化以及底层实现(B+Tree))
一 , 逻辑分层 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理.授权认证.安全等. 服务层:包括缓存查询.解析器.优化器,这一部分是MySQL核 ...
- Postgresql_根据执行计划优化SQL
执行计划路径选择 postgresql查询规划过程中,查询请求的不同执行方案是通过建立不同的路径来表达的,在生成许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行 ...
- oracle里的查询转换
oracle里的查询转换的作用 Oracle里的查询转换,有称为查询改写,指oracle在执行目标sql时可能会做等价改写,目的是为了更高效的执行目标sql 在10g及其以后的版本中,oracle会对 ...
- 朱世杰恒等式的应用-以CF841C为例
题目大意 Codeforces 841C Leha and Function. 令\(F(n,k)\)为在集合\(\{x|x \in [1,n]\}\)中选择一个大小为k的子集,最小元素的期望值. 给 ...
- 详细分析SQL语句逻辑执行过程和相关语法
本文目录: 1.SQL语句的逻辑处理顺序 1.2 各数据库系统的语句逻辑处理顺序 1.2.1 SQL Server和Oracle的逻辑执行顺序 1.2.2 MariaDB的逻辑执行顺序 1.2.3 M ...
- bzoj 3944 杜教筛
题目中要求phi和miu的前缀和,利用杜教筛可以推出公式.我们令为 那么有公式 类比欧拉函数,我们可以推出莫比乌斯函数的和公式为 (公式证明懒得写了,主要核心是利用Dirichlet卷积的性质 ph ...
- MySql数据查询的逻辑蕴含条件问题
SQL语言中没有蕴含逻辑运算.但是,可以利用谓词演算将一个逻辑蕴含的谓词等价转换为:p->q ≡┐p∨q. 我们通过一个具体的题目来分析:(具体的表和数据详见文章:Mysql数据库中的EXIST ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
随机推荐
- 基于Taro开发京东小程序小记
一.小程序基础模型 这里要从微信小程序的历史说起,从前身到现在大概分为3个阶段: 阶段1: 微信网页需要用到app的原生能力,微信官方推出了js-sdk 阶段2: 解决移动端白屏问题,采用微信web资 ...
- 智能制造之路—从0开始打造一套轻量级MOM平台之仓库管理(WMS)
一.前言 讲仓库管理(WMS)之前,我们先来谈一谈ERP.前一篇文章,大家可以看出,我在做MOM平台规划的时候并没有提到任何ERP的信息,并不是被忽略掉了:而是对于制造企业来说,ERP是重中之重. M ...
- ubuntu安装msf签名认证失败
添加命令 apt-get --allow-unauthenticated upgrade 来允许未认证签名软件安装,但是可能有恶意软件安装进来,可以使用 sudo apt-key adv --keys ...
- Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用
Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用 1. 什么是PhysicsRaycaster组件? PhysicsRaycaster是Unity UGUI中的 ...
- mysql-workbench-community报错解决办法
输入以下命令: sudo apt-get -f install 参考链接:https://www.jianshu.com/p/767c9a29b403
- Proxmox VE软件防火墙的配置
1 软件防火墙的基本概念 防火墙是计算机网络中用于保护网络安全的关键技术.防火墙可以是硬件设备部署在网络出口,也可以是软件部署在终端设备出口.本文主要介绍软件防火墙. 软件防火墙可以根据网络流量的方向 ...
- C++多线程中互斥量的使用
多线程中互斥信号量(Mutex)的使用 1.0 互斥量的基本概念 1.1 Example \(\quad\)首先我们要明白,为什么会有互斥信号量的出现,在多线程编程中,不同的线程之间往往要对同一个数据 ...
- centos7离线安装harbor
前言 harbor是一个docker私有仓库,基于docker官方的registry,提供GUI.权限控制.项目管理等功能. 安装harbor前,需要先安装docker和docker-compose ...
- AVR汇编(七):位操作和MCU控制指令
AVR汇编(七):位操作和MCU控制指令 位操作指令 SBI / CBI SBI 指令用于设置I/O寄存器中的第 b 位, CBI 指令用于清除I/O寄存器中的第 b 位. 例如: SBI DDRB, ...
- Docker容器怎么安装Vim编辑器
在现代软件开发和系统管理中,Docker已经成为一个不可或缺的工具.它允许我们轻松地创建.部署和运行应用程序,以及构建可移植的容器化环境.然而,在Docker容器中安装特定的工具可能会有一些挑战, ...