select * from T1 where x in ( select y from T2 )

çalışması:

select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;

Subquery sonucta, distinct, ve indexli (hashed veya sorted) ve join yapmıs
original tabloyla.


Tersi ise

select * from t1 where exists ( select null from t2 where y = x )

Bunun calisması:


for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop

Bunun sonucu genelde full scan T1 yada ilk sorgunun indexli olması T1(x).


Sonucta, Exists daha uygun oldugu senaryo icin

Sunu soyleyebiliriz eger subqueyin sonucu ( select y from T2 ) cok buyukse
ve cok zaman alıyorsa kullanılabilir.


Eger subquery kucukse IN cok daha uygun bir secim olacaktır.

Eger her iki tabloda gercekten buyukse o zaman diger faktorleri dikkate almamız
gerekmektedir.
Bu faktorleri indexler gibi gorebiliriz.Bu faktorler index distinct gibi faktorler varsa
in performansı daha iyi olacağı düşünülebilir.