同事找我优化一些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. 2021-7-7 VUE笔记2

    if实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scri ...

  2. pywintypes.com_error: (-2147418111, '被呼叫方拒绝接收呼叫。', None, None)

    将打开的excel全部关闭,即可解决问题.

  3. [prometheus]基于influxdb2实现远端存储

    前言 Prometheus自带的时序数据库胜在使用方便,缺点在于难以维护,如果数据有问题,可能需要删除存储目录.重建目录再重启Prometheus,才能恢复正常.而且Prometheus自带的时序数据 ...

  4. SQL 注入学习手册【笔记】

    SQL 注入基础 [若本文有问题请指正] 有回显 回显正常 基本步骤 1. 判断注入类型 数字型 or 字符型 数字型[示例]:?id=1 字符型[示例]:?id=1' 这也是在尝试闭合原来的 sql ...

  5. 给你安利一款带有AI功能的数据库管理工具

    写在前面 说到数据库管理工具,大家应该不陌生了 小伙伴们应该都用过Navicat.DBever.DataGrip.SQLyog.plsqldeveloper等数据库管理工具 这些工具呢都各自有优缺点. ...

  6. java与es8实战之二:实战前的准备工作

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  7. 《Linux基础》02. 目录结构 · vi、vim · 关机 · 重启

    @ 目录 1:目录结构 2:vi.vim快速入门 2.1:vi 和 vim 的三种模式 2.1.1:一般模式 2.1.2:编辑模式 2.1.3:命令模式 2.2:常用快捷键 2.2.1:一般模式 2. ...

  8. 集群部署专题之二:超高性能RPC框架Zeroc-ICE集群部署简易教程

    一.前言 Zeroc ICE在简中互联网的资料十分匮乏,以至于大家线上使用时可能会有所顾虑.其实大家尽可放心,ZerocICE是一款性能和稳定性都非常优秀的RPC组件,这也是我当时选择ZerocICE ...

  9. Oracle 高可用 阅读笔记

    1   个人理解概述 1.1  Oracle dg Oracle Data Guard通过从主数据库传输redo data,然后将apply redo到备用数据库,自动维护每个备用数据库.DG分为3个 ...

  10. Pandas 读取 Excel 斜着读

    读取 Excel 斜着读数据 import pandas as pd def read_sideling(direction, sheet_name, row_start, col_start, ga ...