我的看法-在實際應用中Oracle的EXISTS與IN的使用及效率-遇到的問題與想法記錄

在工做中遇到一個SQL查詢中IN的參數會打到11萬的數量,因此就想提升一下運行效率就寫了另一種EXISTS寫法的SQL執行結果令我十分意外。數據庫

關於ORACLE對於IN的參數限制性能

Oracle 9i 中個數不能超過256,Oracle 10g個數不能超過1000.可是在Oracle 11g中已經解除了這個限制spa

我用的是Oracle 11gcode

執行SQL索引

SQL A :內存

IN寫法it

select DISTINCTio

    a.aay002 as CODENAME,效率

    a.aay003 as CODEVALUEselect

    from A a left join P p on a.aay002 = p.aay002

    where 1=1

    and a.bya343 is not null  and a.bya343 <> 0

    and a.aae100 = '1'

    and a.aay103 = '2AA'

    and a.aab038 in (

        select unit_code from 

          (select code UNIT_CODE, name COMENAME from B 

           where 1=1

           and unit_level in ('2','3','4','5') 

           and is_enabled = '1'

           start with id= '00000000' connect by prior   id = parent_id 

           )

    )

 

order by a.aay002

查詢結果:212條數據,耗時:2.773秒

SQL B :

 

EXISTS寫法

 

select DISTINCT

    a.aay002 as CODENAME,

    a.aay003 as CODEVALUE

    from A a left join P p on a.aay002 = p.aay002

    where 

    exists 

    (select 1 from B 

    where code = a.aab038 

    start with id = '00000000' 

    connect by prior id = parent_id)

    and a.bya343 is not null  and a.bya343 <> 0

    and a.aae100 = '1'

    and a.aay103 = '2AA'

order by a.aay002;

 

A表數據量:9040條

B表數據量:111839條

P表數據量:50條

 查詢結果:212條數據,耗時:137.548秒

我的總結:在Oracle 11g之後查詢SQL中IN效率比EXISTS快不少

可是在網上查詢到的信息是:

舉例:

select *  from A where id in(select id from B);

select *  from A where exists (select 1 from B where A.id = B.id);

如:A表有10000條記錄,B表有1000000條記錄,那麼exists()會執行10000次去判斷A表中的id是否與B表中的id相等。
如:A表有10000條記錄,B表有100000000條記錄,那麼exists()仍是執行10000次,由於它只執行A.length次,可見B表數據越多,越適合exists()發揮效果。
再如:A表有10000條記錄,B表有100條記錄,那麼exists()仍是執行10000次,還不如使用in()遍歷10000*100次,由於in()是在內存裏遍歷比較,而exists()須要查詢數據庫,咱們都知道查詢數據庫所消耗的性能更高,而內存比較很快

結論:exists()適合B表比A表數據大的狀況

當A表數據與B表數據同樣大時,in與exists效率差很少,可任選一個使用。

與網上結論相駁。緣由目前懷疑可能與表結構與索引有關,若有新的進展會繼續更新,目前仍是用IN效率高

相關文章
相關標籤/搜索