日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

sql中 in , not in , exists , not exists效率分析

發(fā)布時(shí)間:2024/7/19 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql中 in , not in , exists , not exists效率分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

in和exists執(zhí)行時(shí),in是先執(zhí)行子查詢中的查詢,然后再執(zhí)行主查詢。而exists查詢它是先執(zhí)行主查詢,即外層表的查詢,然后再執(zhí)行子查詢。

exists 和 in 在執(zhí)行時(shí)效率單從執(zhí)行時(shí)間來說差不多,exists要稍微優(yōu)于in。在使用時(shí)一般應(yīng)該是用exists而不用in

如果子查詢得出的結(jié)果集記錄較少,主查詢中的表較大且又有索引時(shí)應(yīng)該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時(shí)使用exists。IN時(shí)不對(duì)NULL進(jìn)行處理。

??????? not exists 和 not in 比較時(shí),not exists 的效率比較高。

??????? 為了說明測(cè)試結(jié)果,我把emp1表中的數(shù)據(jù)到了315392條。emp2中刪除只有2條件數(shù)據(jù)。測(cè)試的依據(jù)是執(zhí)行的時(shí)間來說明的。

??????? 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í)行十次,最長(zhǎng)一次為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ù)十次,最長(zhǎng)的一次為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ù)十次,最長(zhǎng)的一次為0.047S

綜上所述:在使用in 和 exists時(shí),個(gè)人覺得,效率差不多。而在not in 和 not exists比較時(shí),not exists的效率要比not in的效率要高。

當(dāng)使用in時(shí),子查詢where條件不受外層的影響,自動(dòng)優(yōu)化會(huì)轉(zhuǎn)成exist語(yǔ)句,它的效率和exist一樣。(沒有驗(yàn)證)

如select * from t1 where f1 in (select f1 from t2 where t2.fx='x') 這時(shí),認(rèn)為in 和 exists效率一樣。

IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。

轉(zhuǎn)載于:https://www.cnblogs.com/csl0910/p/4936344.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的sql中 in , not in , exists , not exists效率分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。