ITPub博客

首页 > 数据库 > Oracle > SQL优化案例-用left join代替not in反连接(十)

SQL优化案例-用left join代替not in反连接(十)

原创 Oracle 作者:哎呀我的天呐 时间:2018-12-06 08:35:08 0 删除 编辑

sql如下:

反链接

SELECT R.ORDER_NO
  FROM KKTRIBE_CORE_BASE.ITEM_ORDER R
 WHERE R.ALLOCATE_COMMISSION_STATUS = 'FINISH'
   AND R.ORDER_NO NOT IN (SELECT ORDER_NO FROM (SELECT B.ORDER_NO, COUNT(*) COUNT_NUM
                             FROM KKTRIBE_CORE_BASE.ORDER_ALLOCATE_COM_FUND_BILL B
                                   WHERE B.STATUS NOT IN ('FINISH')
                                   GROUP BY B.ORDER_NO) T
                           WHERE T.COUNT_NUM != 0);

执行计划:


可以一眼定位问题,至于优化器选取这样的方式显然不好啊,一般not in,not exists中的子查询有group by,union all,union,start with connect by都会产生filter,但是此sql的group by外面还一层,不应该,那么我们改sql好了。

改成SQL如下:

SELECT R.ORDER_NO
  FROM KKTRIBE_CORE_BASE.ITEM_ORDER R
  LEFT JOIN (SELECT ORDER_NO
               FROM (SELECT B.ORDER_NO, COUNT(*) COUNT_NUM
                       FROM KKTRIBE_CORE_BASE.ORDER_ALLOCATE_COM_FUND_BILL B
                      WHERE B.STATUS NOT IN ('FINISH')
                      GROUP BY B.ORDER_NO) T
              WHERE T.COUNT_NUM != 0) X
    ON R.ORDER_NO = X.ORDER_NO
 WHERE R.ALLOCATE_COMMISSION_STATUS = 'READY'
   AND X.ORDER_NO IS NULL;

执行计划:

sql从10分钟到1秒不到,秒出

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29990276/viewspace-2284319/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论
从事Oracle/MySQL工作多年,11g OCM,擅长Oracle/MySQL SQL Tuning & DB Performance,高可用方案架构| 企鹅group:935221403|对Oracle优化、迁移、故障诊断技术感兴趣的朋友欢迎一起学习交流

注册时间:2014-10-30

  • 博文量
    218
  • 访问量
    1753920