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
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