in 연산자의 처리순서는 서브쿼리 -> 메인쿼리 이다.
따라서 서브에서 메인의 정보를 가져올 수 가 없기 때문에 조건을 각각 설정한다.
반면에,
exists 연산자는 처리순서가 메인쿼리 -> 서브쿼리 이다.
따라서 서브에서 메인의 정보를 가져와 모든 조건을 한번에 설정한다.
The EXISTS clause is much faster than IN when the subquery results is very large. Conversely, the IN clause is faster than EXISTS when the subquery results is very small.
Also, the IN clause can't compare anything with NULL values, but the EXISTS clause can compare everything with NULLs.
결론 :
in은 in내에 있는 서브쿼리를 계산해서 결과를 내고 해당 결과를 메인쿼리와 비교하는 방식으로 결과를 도출하고 ,
exist는 메인쿼리를 계산하고 해당 결과를 하나씩 exist조건과 비교하며 하나라도 해당하는게 있으면 TRUE를 반환하고 종료한다.
Subquery 사이즈가 크면 EXISTS 의 속도가 더 빠르고,
Subquery 사이즈가 작으면 IN 의 속도가 더 빠르다.
그러나 Cost-base Optimize는 In와 Exist의 쿼리 계획을 동일하게 세우기 때문에 속도의 차이가 없다, 해당 차이는 Rule-base Optimize를 이용할 때의 차이이다.