简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别-阿里云开发者社区

开发者社区> leo平头哥> 正文

简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别

简介: 我司某程序员:一个简单的查询功能对业务系统没有多大影响...我:...... 看破不说破.....面对这样的SQL 也难起波澜了 转交给DBA 10年经验程序员写的原语句:SELECT mobile FROM actdb.
+关注继续查看

我司某程序员:一个简单的查询功能对业务系统没有多大影响...
我:......

看破不说破.....
面对这样的SQL 也难起波澜了 转交给DBA

10年经验程序员写的原语句:
SELECT

mobile

FROM

actdb.act_customer_info

WHERE

(
    create_date BETWEEN '2019-02-25 00:00:00'
    AND '2019-02-26 00:00:00'
)

AND (

id NOT IN (
    SELECT
        customer_id
    FROM
        parttime.ls_bill_info
    WHERE
        create_date BETWEEN '2019-02-25 00:00:00'
    AND '2019-02-26 00:00:00'
)

);
原语句执行时间68秒

DBA优化后语句:
SELECT

mobile

FROM

actdb.act_customer_info a

WHERE

create_date BETWEEN '2019-02-25 00:00:00'

AND '2019-02-26 00:00:00'
AND NOT EXISTS (

SELECT
    1
FROM
    parttime.ls_bill_info b
WHERE
    a.id = b.customer_id
AND b.create_date BETWEEN '2019-02-25 00:00:00'
AND '2019-02-26 00:00:00'

);
DBA优化后语句执行时间31秒

最后自己再花1分钟重写一下吧 ,也是满心惆怅啊......
SELECT

a.mobile,
a.id,
c.customer_id

FROM

actdb.act_customer_info a

LEFT JOIN (

SELECT
    customer_id
FROM
    parttime.ls_bill_info b
WHERE
    b.create_date BETWEEN '2019-02-25 00:00:00'
AND '2019-02-26 00:00:00'

) c ON a.id = c.customer_id
WHERE

a.create_date BETWEEN '2019-02-25 00:00:00'

AND '2019-02-26 00:00:00'
AND c.customer_id IS NULL
本质就是not in 和 not exists和left join的区别
这里就不发相关详细执行计划了,简单但又不简单,相信程序员或者DBA都可以写,但偏偏上线的是最差的一条.......

任重道远,磨砺前行吧~

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
offsetTop、 offsetLeft、offsetWidth、offsetHeight的用法
假设 obj 为某个 HTML 控件。 obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置,整型,单位像素。 obj.offsetLeft 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置,整型,单位像素。
656 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4543 0
SQL语句Left join 中On和Where的用法区别
原文地址:点击打开链接 SQL语句如下: SELECT *  FROM 表1   LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff' WHERE 表1.NAME != 'aa'         步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2)   步骤2:应用ON筛选器(当前的条件为
1090 0
一个字符串是否在另外一个字符串数组里 Array.Exists 的用法 Array.IndexOf 用法
转: using System; class Program { static void Main() { string[] array = { "cat", "dot", "perls" }; // Use Array.
699 0
【MySQL】数据安全性讨论思维导图
一  前言     和团队内部的同事一起沟通,讨论了MySQL 数据库系统数据安全性问题,主要针对MySQL丢数据库的场景 ,主从不一致的场景 ,还有业务层面使用不得当导致主备库数据结构不一样的情况,本文是基于以上的讨论和总结做的思维导图。
1042 0
C#--使用Timer类和Join方法管理线程
Timer类允许将"fire-and-forget"线程添加到用户程序。在实例化Timer对象时,需要指定以下4个参数 callback  提供Timer将调用方法的TimerCallback委托 state  应该传递给TimerCallback方法的对象。
493 0
【MySQL】undo,redo,2PC,恢复思维导图
一 前言    本来今天打算继续研究InnoDB 锁机制并完成第二篇文章,查找资料的时候忽悠想起来自己遗漏了之前的CSDN的公开课《深入理解MySQL中的undo,redo,mvcc》 。
1012 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3381 0
+关注
leo平头哥
一蓑烟雨任平生,也无风雨也无晴
1
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载