EXISTS和IN的區別

2021-08-07 21:44:08 字數 1001 閱讀 4162

這是我以前參與過的乙個專案的經驗,sql(這只是乙個示意語句)語句如下

update a cd

set cd. flag='0001', cd.date = sysdate

whereexists(

select 1

from (

select tc.dno,tc.gno

from b tc,c ad

where tc.gno = ad.dno

and ad.dno = 'sssssssssssssssss'

) awhere a.dno = cd.dno

and a.gno = cd.gno

這條語句的基本功能就是兩張表中的資料,查詢到一條符合條件的資料,並根據這條資料的id,修改第三張表裡面的某些值,但是這三張表都是百萬級的資料記錄,在使用這條語句的時候,根據客戶反應,大概需要20幾分鐘,才能正常完成,這是使用者無法接受的。

我們仔細分析的sql語句,發現使用的關鍵字是exists,而exists是對外表作loop,每次loop再對那錶進行查詢,這樣,多次進行大表查詢,難免會變慢,再考慮一下功能相似in關鍵字,in是對錶進行hash join,比較適合內外表都比較大的情形,而exists適合外表比較小的情形,經過分析,大家一致通過修改為in操作,修改後的語句如下:

update a cd

set cd.flag='0001',date = sysdate

where (dno,gno) in

select tc.dno,tc.gno

from b tc,c ad

where tc.gno = ad.dno

and ad.decl_no = 『ssssssssssss』

修改之後,客戶反映效能大大提公升,現在資料量沒變,但是完成相同的功能,卻只需要1分鐘不到的時間。

綜上所述,in 和 exists都是有自己的適用環境的,並不存在哪個關鍵字優於哪乙個的情況,同時,也要求我們在具體使用的時候,要選擇適合自己需要的情況使用。

in 和 exists的區別

select from a where id in select id from b 以上查詢使用了in語句,in 只執行一次,它查出b表中的所有id欄位並快取起來.之後,檢查a表的id是否與b表中的id相等,如果相等則將a表的記錄加入結果集中,直到遍歷完a表的所有記錄.它的查詢過程類似於以下過程 ...

in和exists的區別

in是把外表和內錶作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大 如果兩個表中乙個較小乙個較大,則子查詢表大的用exists,子查詢錶小的用in ...

IN 和EXISTS的區別

select from a where id in select id from b 以上查詢使用了in語句,in 只執行一次,它查出b表中的所有id欄位並快取起來.之後,檢查a表的id是否與b表中的id相等,如果相等則將a表的記錄加入結果集中,直到遍歷完a表的所有記錄.它的查詢過程類似於以下過程 ...