1. 程式人生 > >not in 優化策略

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

從上述執行時間,可以很清晰的看到表連線的優勢,資料量小時也許差別不大,資料量越大,這種優勢就能很好的體現出來了。在平時的開發過程中,要多嘗試多測試,不斷提升響應速度。

--------------------- 本文來自 anerou 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/anerou/article/details/5185573?utm_source=copy