exists 和 in 在執(zhí)行時效率單從執(zhí)行時間來說差不多,exists要稍微優(yōu)于in。在使用時一般應該是用exists而不用in
如果子查詢得出的結(jié)果集記錄較少,主查詢中的表較大且又有索引時應該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。IN時不對NULL進行處理。
not exists 和 not in 比較時,not exists 的效率比較高。
為了說明測試結(jié)果,我把emp1表中的數(shù)據(jù)到了315392條。emp2中刪除只有2條件數(shù)據(jù)。測試的依據(jù)是執(zhí)行的時間來說明的。
emp1中的數(shù)據(jù)記錄情況。
SQL> select count(*) from emp1;
COUNT(*)
----------
315392
emp2中的數(shù)據(jù)記錄情況:
SQL> select count(*) from emp2;
COUNT(*)
----------
2
1、 執(zhí)行exists查詢,要求在emp1中查詢出所有存在于emp2的數(shù)據(jù)總數(shù)
SQL> select count(*) from emp1 where exists ( select null from emp2 where emp1.ename = emp2.ename);
COUNT(*)
----------
45056
執(zhí)行次數(shù)十次,最大的一次為0.125S
2、 使用not exists查詢出所在不在emp2中的數(shù)據(jù)總數(shù)
SQL> select count(*) from emp1 where not exists ( select null from emp2 where emp1.ename = emp2.ename);
COUNT(*)
----------
270336
執(zhí)行次數(shù)十次,最大的一次為0.141S
3、執(zhí)行in 查詢,要求在emp1中查詢出所有存在于emp2的數(shù)據(jù)總數(shù)
SQL> select count(*) from emp1 where ename in ( select ename from emp2);
COUNT(*)
----------
45056
執(zhí)行十次,最大的一次為0.141S
4、使用not in查詢出所在不在emp2中的數(shù)據(jù)總數(shù)
SQL> select count(*) from emp1 where ename not in ( select ename from emp2 );
COUNT(*)
----------
270336
執(zhí)行十次,最長一次為0.328S
5、使用in查詢,調(diào)用外層與子查詢的位置,要求查詢出存在于emp2中,且存在于emp1中的數(shù)據(jù)記錄數(shù)
SQL> select count(*) from emp2 where ename in (select ename from emp1 );
COUNT(*)
----------
2
執(zhí)行次數(shù)十次,最長的一次為0.047S
6、使用exists查詢,調(diào)用外層與子查詢的位置,要求查詢出存在于emp2中,且存在于emp1中的數(shù)據(jù)記錄數(shù)
SQL> select count(*) from emp2 where ename in (select ename from emp1 );
COUNT(*)
----------
2
執(zhí)行次數(shù)十次,最長的一次為0.047S
綜上所述:在使用in 和 exists時,個人覺得,效率差不多。而在not in 和 not exists比較時,not exists的效率要比not in的效率要高。
當使用in時,子查詢where條件不受外層的影響,自動優(yōu)化會轉(zhuǎn)成exist語句,它的效率和exist一樣。(沒有驗證)
如select * from t1 where f1 in (select f1 from t2 where t2.fx='x') 這時,認為in 和 exists效率一樣。
IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com