同事找我优化一些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案例的更多相关文章

  1. 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇

    一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...

  2. 《 Oracle查询优化改写 技巧与案例 》电子工业出版社

    第1章单表查询 11.1 查询表中所有的行与列 11.2 从表中检索部分行 21.3 查找空值 31.4 将空值转换为实际值 41.5 查找满足多个条件的行 51.6 从表中检索部分列 61.7 为列 ...

  3. 利用Merge into 改写Update SQL 一例

    前言 客户说,生产系统最近CPU使用率经常达到100%,请DBA帮忙调查一下. 根据客户提供的情况描述及对应时间段,我导出AWR,发现如下问题: 11v41vaj06pjd :每次执行消耗2,378, ...

  4. OR 改写union数据变少

    <pre name="code" class="sql">SQL> SELECT deptno FROM emp WHERE mgr = 76 ...

  5. dense_rank()+hash提示改写优化SQL

    数据库环境:SQL SERVER 2005 今天看到一条SQL,返回10条数据,执行了50多S.刚好有空,就对它进行了优化,优化后1S出结果. 先看下原始SQL SELECT t1.line_no , ...

  6. 性能测试四十二:sql案例之联合索引最左前缀

    联合索引:一个索引同时作用于多个字段 联合索引的最左前缀: A.B.C3个字段--联合索引 这个时候,可以使用的查询条件有:A.A+B.A+C.A+B+C,唯独不能使用B+C,即最左侧那个字段必须匹配 ...

  7. 性能测试四十一:sql案例之慢sql配置、执行计划和索引

    MYSQL 慢查询使用方法MYSQL慢查询介绍分析MySQL语句查询性能的问题时候,可以在MySQL记录中查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”.MYSQL自带的慢查 ...

  8. pl/sql案例

    项目生命周期: 瀑布模型 拿到一个项目后,首先:分析需要用到的SQL语句: 其次:分析需要定义的变量初始值是多少,怎么得到最终值: 案例一: 统计每年入职的员工数量以及总数量: SQL语句:selec ...

  9. 实际SQL案例解决方法整理_LEAD函数相关

    表结构及数据如下: 需求: 将记录按照时间顺序排列,每三条记录为一组,若第二条记录与第一条记录相差5分钟,则删除该记录,若第三条与第二条记录相差5分钟,则删除该记录, 第二组同理,遍历全表,按要求删除 ...

  10. Hive手写SQL案例

    1-请详细描述将一个有结构的文本文件student.txt导入到一个hive表中的步骤,及其关键字 假设student.txt 有以下几列:id,name,gender三列 1-创建数据库 creat ...

随机推荐

  1. 反汇编分析C语言

    环境 VC6.0环境 空函数反汇编 #include "stdafx.h" void function(){ } int main(int argc, char* argv[]) ...

  2. Anaconda 使用时,conda activate 失败

    今天使用一台电脑上新安装的 anaconda 时,运行 conda activate, 出现如下报错: 错误提示中,说要把 . C:\ProgramData\Anaconda3\etc\profile ...

  3. 聊聊自然语言处理NLP

    概述 自然语言处理(NLP)的正式定义:是一个使用计算机科学.人工智能(AI)和形式语言学概念来分析自然语言的研究领域.不太正式的定义表明:它是一组工具,用于从自然语言源(如web页面和文本文档)获取 ...

  4. 传输层之UDP与TCP的首部

    从通信信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最底层. 传输层位于应用层和数据链路层之间,主要有两个协议,用户数据报协议UDP(User D ...

  5. Ceres简单应用-求解(Powell's Function)鲍威尔函数最小值

    Ceres 求解 Powell's function 的最小化 \(\quad\)现在考虑一个稍微复杂一点的例子-鲍威尔函数的最小化. \(\quad{}\) \(x=[x_1,x_2,x_3,x_4 ...

  6. redis集群:MASTER aborted replication with an error: NOAUTH Authentication required.

    发现个问题:redis集群所在服务器,磁盘空间很快就被占满,使用 "du -sh *"查看每个文件夹的大小,发现redis集群三个从节点的日志文件占用空间很大. 下面记录问题排查及 ...

  7. 一张图读懂TuGraph Analytics开源技术架构

    TuGraph Analytics(内部项目名GeaFlow)是蚂蚁集团开源的分布式实时图计算引擎,即流式图计算.通过SQL+GQL融合分析语言对表模型和图模型进行统一处理,实现了流.批.图一体化计算 ...

  8. SpringBoot 笔记

    SpringBoot 笔记 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 2014,martin fowler 微服务:架构风格(服务微化) 一个应用应该是一组小型服 ...

  9. 四层负载均衡的NAT模型与DR模型推导

    导读 本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理.通过本文可以了解到四层负载均衡的技术特点.NAT模型和DR模型的工作原理.以及NAT模 ...

  10. CodeForces 1367E Necklace Assembly

    题意 给定一个字符串\(s\),长度为\(n\),一根项链为一个环,定义一根项链为\(k-beautiful\),则该项链顺时针转\(k\)下后与原项链相等,给出\(k\),请构造一根最长的\(k-b ...