總結網友們在csdn社群上對於not in的優化策略,整理如下,備查。
select * from emp where emp_no not in (select emp_no from emp_bill)
要求用兩種
sql寫法優化上面
sql。
方法一、
select*
from
emp a
where
notexists
(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
selectnofromno_infowherenonotin
(selectdistinctnofromnotify_info_bakwhere1=1
andcall_time >= to_date(
'2009-12-13'
,'yyyy-mm-ss'
)andcall_time <= to_date(
'2010-1-13'
,'yyyy-mm-ss'
))11.375秒
selectnofromno_info awherenotexists
(select1
from
(selectdistinctnofromnotify_info_bakwhere1=1
andcall_time >= to_date(
'2009-12-13'
,'yyyy-mm-ss'
)andcall_time <= to_date(
'2010-1-13'
,'yyyy-mm-ss'
)) bwherea.no=b.no)andnvl(a.no,
'1')!=
'1'11.312秒
selectnofromno_info awherenotexists
(select1
from
(selectdistinctnofromnotify_info_bakwhere1=1
andcall_time >= to_date(
'2009-12-13'
,'yyyy-mm-ss'
)andcall_time <= to_date(
'2010-1-13'
,'yyyy-mm-ss'
)) bwherea.no=b.no)
4.313秒
selecta.nofromno_info a,(selectdistinctnofromnotify_info_bakwhere1=1
andcall_time >= to_date(
'2009-12-13'
,'yyyy-mm-ss'
)andcall_time <= to_date(
'2010-1-13'
,'yyyy-mm-ss'
)) bwherea.no=b.no(+)andnvl(b.no,
'1')=
'1'andnvl(a.no,
'1')!=
'1'
0.219秒
從上述執行時間,可以很清晰的看到表連線的優勢,資料量小時也許差別不大,資料量越大,這種優勢就能很好的體現出來了。在平時的開發過程中,要多嘗試多測試,不斷提公升響應速度。
sql優化 in 和 not in 語句
why?in 和 not in 是比較常用的關鍵字,為什麼要盡量避免呢?1 效率低 可以參看我之前遇到的乙個例子 小問題筆記 九 sql語句not in 效率低,用 not exists試試 2 容易出現問題,或查詢結果有誤 不能更嚴重的缺點 以 in 為例。建兩個表 test1 和 test2 c...
SQL優化 避免使用 IN 和 NOT IN
1 效率低 2 容易出現問題,或查詢結果有誤 不能更嚴重的缺點 insert into test2 id2 values null 跑題一句 建表的時候最好不要允許含空值,否則問題多多。1 用 exists 或 not exists 代替 select from test1 where exists...
MS Sql 優化步驟及優化not in一例
今天接到客戶投訴說系統卡死了,經過一翻努力,終於解決了。現將解決步驟記錄一下,以便下次參考 因為客戶系統集中在阿里雲上面,使用的是ms sql2008資料庫,上面有n個客戶,一下子無法知道是哪個客戶。第一步,先開啟任務管理器,看看cpu使用情況,一看就知道是 ms sql server有大查詢占用了...