or等价改写union SQL案例
同事找我优化一些SQL,其中有个SQL比较经典,拿出来分享给大家,从原来执行2分钟,到1.4S出结果。
-- 原SQL
SELECT
count (*)
FROM (
SELECT
DISTINCT T1.id,
T1.doc_no,
T1.title,
T1.type,
T1.addTime,
T1.urgency,
T1.addUser,
T1.fileNo,
T1.fileNoID,
T1.orgId,
T1.deptId,
T1.fromDept,
T1.docType,
T1.docTypeID,
T1.isOld,
T1.publicState,
T1.oaPublicState,
P.state AS activeState,
P.cate_id AS cateID,
P.id AS procInsID
FROM
A T1,
B P
WHERE
T1.id = P.case_id
AND T1.addTime >= '2021-11-17 00:00:00'
AND T1.addTime <= '2022-11-17 23:59:59'
AND T1.type IN ('receive', 'dispatch', 'draft')
AND (T1.oapublicstate = '1'
OR EXISTS (
SELECT
P.case_id AS wf_case_id
FROM
wf_proc_ins_handlers H
WHERE
P.id = H.proc_ins_id
AND H.handler_id = '704fa12e-0166-1000-e000-05a00a010169'))) x;

这个节点循环了 47108 次,这个节点所需要的时间计算为 47108 * 2.695 = 126,956.06ms ,2分钟,影响了整条SQL的执行时间。
对应的SQL语句是这段

这种语句使用OR 加任何索引都不好使,想要优化只能改写改SQL。
-- 改写SQL优化 with x as (
SELECT
DISTINCT T1.id,
T1.doc_no,
T1.title,
T1.type,
T1.addTime,
T1.urgency,
T1.addUser,
T1.fileNo,
T1.fileNoID,
T1.orgId,
T1.deptId,
T1.fromDept,
T1.docType,
T1.docTypeID,
T1.isOld,
T1.publicState,
T1.oaPublicState,
P.state AS activeState,
P.cate_id AS cateID,
P.id AS procInsID
FROM
A T1,
B P
WHERE
T1.id = P.case_id
AND T1.addTime >= '2021-11-17 00:00:00'
AND T1.addTime <= '2022-11-17 23:59:59'
AND T1.type IN ('receive', 'dispatch', 'draft') )
select count(*) from (
select x1.* from x x1 where x1.oapublicstate = '1'
union
select x2.* from x x2 left join wf_proc_ins_handlers h on x2.procInsID = h.proc_ins_id where h.handler_id = '704fa12e-0166-1000-e000-05a00a010169' and h.proc_ins_id is not null
);
SQL 执行计划

修改之后只需要1.4S 就能出结果,两条语句比较 count(*) 结果集等价。
or等价改写union SQL案例的更多相关文章
- 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇
一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...
- 《 Oracle查询优化改写 技巧与案例 》电子工业出版社
第1章单表查询 11.1 查询表中所有的行与列 11.2 从表中检索部分行 21.3 查找空值 31.4 将空值转换为实际值 41.5 查找满足多个条件的行 51.6 从表中检索部分列 61.7 为列 ...
- 利用Merge into 改写Update SQL 一例
前言 客户说,生产系统最近CPU使用率经常达到100%,请DBA帮忙调查一下. 根据客户提供的情况描述及对应时间段,我导出AWR,发现如下问题: 11v41vaj06pjd :每次执行消耗2,378, ...
- OR 改写union数据变少
<pre name="code" class="sql">SQL> SELECT deptno FROM emp WHERE mgr = 76 ...
- dense_rank()+hash提示改写优化SQL
数据库环境:SQL SERVER 2005 今天看到一条SQL,返回10条数据,执行了50多S.刚好有空,就对它进行了优化,优化后1S出结果. 先看下原始SQL SELECT t1.line_no , ...
- 性能测试四十二:sql案例之联合索引最左前缀
联合索引:一个索引同时作用于多个字段 联合索引的最左前缀: A.B.C3个字段--联合索引 这个时候,可以使用的查询条件有:A.A+B.A+C.A+B+C,唯独不能使用B+C,即最左侧那个字段必须匹配 ...
- 性能测试四十一:sql案例之慢sql配置、执行计划和索引
MYSQL 慢查询使用方法MYSQL慢查询介绍分析MySQL语句查询性能的问题时候,可以在MySQL记录中查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”.MYSQL自带的慢查 ...
- pl/sql案例
项目生命周期: 瀑布模型 拿到一个项目后,首先:分析需要用到的SQL语句: 其次:分析需要定义的变量初始值是多少,怎么得到最终值: 案例一: 统计每年入职的员工数量以及总数量: SQL语句:selec ...
- 实际SQL案例解决方法整理_LEAD函数相关
表结构及数据如下: 需求: 将记录按照时间顺序排列,每三条记录为一组,若第二条记录与第一条记录相差5分钟,则删除该记录,若第三条与第二条记录相差5分钟,则删除该记录, 第二组同理,遍历全表,按要求删除 ...
- Hive手写SQL案例
1-请详细描述将一个有结构的文本文件student.txt导入到一个hive表中的步骤,及其关键字 假设student.txt 有以下几列:id,name,gender三列 1-创建数据库 creat ...
随机推荐
- std::ofstream 写本地音频
最近线上 PK 偶然出现双方主播互相听不见声音的情况,在日志不能明确体现问题时,就需要抓下主播本地的音频和远端的音频来确定数据是在哪消失的 所以我们用到一个比较简单的流写出的标准库类:std::ofs ...
- iframe与主窗口通信
1. 引言 <iframe> 元素是 HTML 中的一个标签,用于在当前页面中嵌入另一个页面 使用 <iframe> 可以实现以下功能: 嵌入其他网页:可以将其他网页嵌入到当前 ...
- 助力618-Y的混沌实践之路
一.写在前面 1.混沌是什么? 混沌工程(Chaos Engineering)的概念由 Netflix 在 2010 年提出,通过主动向系统中引入异常状态,并根据系统在各种压力下的行为表现确定优化策略 ...
- C++多线程中互斥量的使用
多线程中互斥信号量(Mutex)的使用 1.0 互斥量的基本概念 1.1 Example \(\quad\)首先我们要明白,为什么会有互斥信号量的出现,在多线程编程中,不同的线程之间往往要对同一个数据 ...
- Codeforces 1855B:Longest Divisors Interval 最长的连续约数区间
1855B.Longest Divisors Interval Description: 对于一个整数 \(n\) \((1\leq n \leq 10^{18})\),找到一段最长的区间\([l,r ...
- FlinkSQL类型系统
类型有什么作用, 类型可以提供编译期检查, 避免到运行期才报错. 类型 首先Flink中自己定义了一套类型, 有LogicalType和DataType两个表示 LogicalType Logical ...
- [python]使用diagrams绘制架构图
简介 diagrams是python的一个第三方库,用于实现使用代码绘制架构图. 安装 依赖于 Graphviz,安装diagrams之前需要先安装 Graphviz(下载压缩包后,将bin目录添加到 ...
- Midjourney的一些学习心得:如何高效的图生图
注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...
- iOS添加图片
添加一个按钮 将图片添加到
- Jquery tableExport.js将网页中的表格导出为Excel
需求:将如下网页中的所有表格一次导入到Excel文件中. 方法:使用jQuery的tableExport.js插件,可以将网页中指定的table表格数据导出到Excel文件,而不需要经过后台. 操作步 ...