教你使用逻辑公式和恒等式等价改写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\)种方案.求最大公约数 ...
随机推荐
- Bash 内建命令
官方文档 Bash内建命令 查看命令是否为Bash内建命令
- Pycharm:显示每一行代码的修改记录
解决方案 安装插件GitToolBox
- 建设数字工厂:MRP物料需求计划的逻辑原理与配置方法
本文分享自华为云社区<数字工厂深入浅出系列(七): MRP物料需求计划的逻辑原理与配置方法>,作者:云起MAE. MRP是生产制造企业"管好"物料的核心工具方法,基本思 ...
- Docker使用教程及常用命令
Docker是一个开源的应用容器引擎,允许开发者将应用以及依赖打包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows上.它非常适用于持续集成与持续交付(CI/CD). 1. 安装 ...
- SpringBoot3文件管理
目录 一.简介 二.工程搭建 1.工程结构 2.依赖管理 三.上传下载 1.配置管理 2.上传下载 四.Excel文件 1.Excel创建 2.Excel读取 3.解析监听 4.导入导出 五.参考源码 ...
- 《Pro Git》Git分支笔记
Git分支简介 在Git中,有个校验和的概念,主要用于验证数据完整性,它是一个40位16进制字符串,使用SHA-1哈希算法生成.校验和也标识了Git中每一个对象. 我们由前一章阅读了解到Git保存的是 ...
- 第一个程序PingPong
功能需求 如图所示,开启两个ping类型的服务ping1和ping2,ping1给ping2发消息,ping2收到回应ping1,ping1收到再回应ping2,不断循环. 服务模块 Skynet提供 ...
- 给DataTable添加额外字段
//dt为DataTable dt.Columns.Add("字段名");//创建字段 //给新增字段赋值 foreach(DataRow item in dt.Rows) { i ...
- CodeForces 1332E Height All the Same
题意 对于一个\(n*m\)的矩阵,有两种操作 一个格子加二 一个格子和另一个相邻的格子同时加一 通过这两种操作最终使得所有矩阵元素相等 对于矩阵元素来说,有\(L\leq a_{i,j}\leq R ...
- 命令行安装ipa包
我们可以通过ssh连接我们的iphone,来使用命令行安装ipa包 itunnel_mux.exe --lport 9993 --iport 22 itunnel_mux.exe --lport 99 ...