oracle中in和exists的區別

2021-12-30 02:44:42 字數 668 閱讀 3705

一直以來,大家認為exists比in速度快,其實是不準確的。且看接下來的具體分析:in其實是將外表和內錶進行hash join,exists是先對外表進行loop操作,然後每次loop後再對內表進行查詢。

如果兩張表大小差不多,那麼exists和in的效率差不多。

例如: 一張大表為a,一張小表b

一、第一種情況

select * from a where mm in (select mm from b)

效率高,這裡用到的是大表a上的索引

select * from b exists (select mm from a where mm=b.mm)

效率高,這裡用到的是小表b上的索引

二、第二種情況

select * from b where mm in (select mm from a)

效率低,這裡用到的是小表b上的索引

select * from a exists (select mm from b where mm=a.mm)

效率高,這裡用到的是大表a上的索引

三、第三種情況

not exists 在使用時依然會用到表上的索引,但是not in會進行全盤掃瞄

因此,not exists 始終比not in 的效率高

四、第四種情況

in與==效果是相同的

ORACLE 中exist和in的區別

博文 oracle中的exists 和not exists 用法 博文 in與exists語句的效率問題 一 exists sql 返回結果集為真 notexists sql 不返回結果集為真 如下 表a id name 1a1 2a2 3a3 表b id aid name 11b1 22b2 32...

oracle常識(一) in和exist的區別

in 與 exist 的語法比較 select from 資料表 t where t.x in 括號內可以是符合t.x欄位型別的值集合,如 1 2 3 但如果t.x是number型別的時候,似乎這樣的寫法會出問題 也可以是通過另外的select語句查詢出來的值集合,如 select y from 資...

sql中in和exist語句的區別?

in和exists in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in 例如 表a 小表 表b 大表 1 select from a where cc in ...