• NOT EXISTS的优化


    参考博文:http://blog.csdn.net/zyz511919766/article/details/49335647

    原来的SQL

    SELECT *
      FROM T_SOF_IMP a
     WHERE not exists (select 1 from t_sof_subscriber b where a.dn=b.dn);
    

    优化之后的SQL

    select a.*
    from T_SOF_IMP a
    left join T_SOF_SUBSCRIBER b
    on a.dn = b.dn
    where b.dn is null;
    

    博文的具体内容如下:

    原始语句:

    1
    SELECT
    2
    *
    3
    FROM
    4
    dcf_account.t_posting_transaction t1
    5
    WHERE
    6
    NOT EXISTS (
    7
    SELECT
    8
    *
    9
    FROM
    10
    dcf_loan.t_account_posting_detail t2
    11
    WHERE
    12
    t1.track_no = t2.posting_num
    13
    );
    关于优化改语句的几点思考:
    对于原始语句,因为是NOT EXISTS判断,所以子查询中没有必要SELECT ,只需SELECT ID甚至是SELECT 1都可以。另外,鉴于MySQL子查询算法性能较差,考虑改写成对应的JOIN方式,因为这里是NOT EXIST判断,所以改写时有一定技巧,即可使用左连接,然后过滤出未能成功连接的记录。还有,原始语句最外层的查询也是SELECT 至于这个是否有必要应当依据具体业务,尽量在满足业务要求的条件下取尽可能少的字段。最后,即时做了上述优化,若在连接条件上没有合适的索引SQL性能仍然会非常差(特别是在表的数据量巨大的时候),所以考虑在连接的条件列t1.track_no 和 t2.posting_num上分别创建索引。
    最终的优化结果如下
    语句由原来的进一个小时的运行时间减少到1秒内。

    1
    SELECT
    2
    t1.id
    3
    FROM
    4
    dcf_account.t_posting_transaction t1
    5
    LEFT JOIN dcf_loan.t_account_posting_detail t2 ON t1.track_no = t2.posting_num
    6
    WHERE
    7
    t2.id IS NULL;

  • 相关阅读:
    SDN第二次作业
    SDN第一次上机作业
    SDN第一次作业
    期末作业验收
    SDN第五次上机作业
    SDN第四次上机作业
    SDN第三次作业
    SDN第三次上机作业
    SDN第二次上机作业
    SDN第二次作业
  • 原文地址:https://www.cnblogs.com/yldf/p/7736374.html
Copyright © 2020-2023  润新知