In和Exist的效率問題
IN:
select * from t1 where x in ( select y from t2 )
事實上可以理解為:
select * from t1 where x = y1;
select * from t1 where x = y2;
:
select * from t1 where x = yn;
即實際上首先找出子查詢中所有可能的值,然後多次執行外查詢。由此可見,有多少個y值,查詢就會進行多少次,因此y值越少則越快。因此IN適合於外表大,而子查詢返回的結果比較少的情況。
EXISTS:
select * from t1 where exists ( select null from t2 where y = x )
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;
這個更容易理解,t1永遠是個表掃描!因此t1絕對不能是個大表,而t2可以很大,因為y=x.x可以走t2.y的索引。
綜合以上對IN/EXISTS的討論,我們可以得出一個基本通用的結論:IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。