not in 優化策略

2021-05-18 11:25:36 字數 3520 閱讀 4706

總結網友們在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有大查詢占用了...