not in 优化策略

总结网友们在CSDN社区上对于not in的优化策略,整理如下,备查。

 

select * from emp where emp_no not in (select emp_no from emp_bill)
要求用两种 SQL 写法优化上面 SQL

方法一、

select *

       from emp a

        where   not exists ( select 1

       from emp_bill b

          where b.emp_no = a.emp_no)

方法二、

select a.*

       from emp a ,emp_bill b

       where a.emp_no=b.emp_no(+)

             and b.emp_no is null

方法二继续优化、

select a.*

       from emp a ,emp_bill b

       where a.emp_no=b.emp_no(+)

             and NVL(b.emp_no, '1') = '1'

 

表连接效率最好, Not Exists 其次, Not in 最低

 

实践:

NO_INFO 数据量: 1971

NOTIFY_INFO_BAK 数据量: 138656

 

 

SELECT NO FROM NO_INFO WHERE NO NOT IN
(SELECT DISTINCT NO FROM NOTIFY_INFO_BAK WHERE
1 = 1  
AND CALL_TIME >= TO_DATE(
'2009-12-13' , 'yyyy-MM-ss' )
AND CALL_TIME <= TO_DATE(
'2010-1-13' , 'yyyy-MM-ss' ))
执行时间: 11.375


SELECT NO FROM NO_INFO A WHERE NOT EXISTS
(SELECT
1 FROM
(SELECT DISTINCT NO FROM NOTIFY_INFO_BAK WHERE
1 = 1  
AND CALL_TIME >= TO_DATE(
'2009-12-13' , 'yyyy-MM-ss' )
AND CALL_TIME <= TO_DATE(
'2010-1-13' , 'yyyy-MM-ss' )) B WHERE A.NO =B.NO ) AND NVL(A.NO , '1' )!= '1'
执行时间: 11.312

SELECT NO FROM NO_INFO A WHERE NOT EXISTS
(SELECT
1 FROM
(SELECT DISTINCT NO FROM NOTIFY_INFO_BAK WHERE
1 = 1  
AND CALL_TIME >= TO_DATE(
'2009-12-13' , 'yyyy-MM-ss' )
AND CALL_TIME <= TO_DATE(
'2010-1-13' , 'yyyy-MM-ss' )) B WHERE A.NO =B.NO )
执行时间: 4.313
             
SELECT A.NO FROM NO_INFO A,(SELECT DISTINCT NO FROM NOTIFY_INFO_BAK WHERE
1 = 1  
AND CALL_TIME >= TO_DATE(
'2009-12-13' , 'yyyy-MM-ss' )
AND CALL_TIME <= TO_DATE(
'2010-1-13' , 'yyyy-MM-ss' )) B WHERE A.NO =B.NO (+) AND NVL(B.NO , '1' )= '1' AND NVL(A.NO , '1' )!= '1'

执行时间: 0.219

 

从上述执行时间,可以很清晰的看到表连接的优势,数据量小时也许差别不大,数据量越大,这种优势就能很好的体现出来了。在平时的开发过程中,要多尝试多测试,不断提升响应速度。

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值