안녕하세요.
짧은 식견으로 몇자 적어 봅니다.
finecomp 님이 답변을 해 주셨지만 좀 더 상세히 말씀드리고자 합니다.
SubQuery 는 두가지 역할 개념이 존재합니다.
첫째 확인자 역할
- Main Query 가 먼저 수행되어 Main Query 결과가 SubQuery 에 상수 값으로 제공되어
Subquery 의 조건을 체크
둘째 제공자 역할
- SubQuery 가 먼저 실행되어 SubQuery 결과가 Main Query 에 상수 값으로 제공되어
Main Query의 조건을 체크
이것이 Subquery 의 역할이고요.
In 과 Exists 의 차이점은 내부적 차이점이 존재 합니다.
In 실행계획을 보게 되면 concatenation + iterator 형태로 실행계획이 만들어 지게 됩니다.
concatenation 으로 Plan 이 만들어진다면 내부적으로 IN (’01’, ’02’, ’03’) 은
select 03’ from dual
union all
select ’02’ from dual
union all
select ’01from dual
형태로 뒤에서 부터 읽여지는 방식이고
Iterator 실행계획이 만들어 진다면 내부적으로 IN (’01’, ’02’, ’03’) 은 Buffer 에 담겨서 바인딩되게 됩니다.
select :변수 from dual
위와 같이 실행이 됩니다.
그럼 Exists 는 어떨까요?
Exists 의 실행 계획을 보게 되면 대부분 Filter로 풀리는 경향이 존재 합니다
물론 Filter 의 종류도 여러가지죠.
Filter 의 종류는 Nested Loop 와 비슷한 역할을 하는 것과 정말 Filter 역할을 하는 것이 존재합니다.
여기서 이 주제까지 이야기하기는 시간이 많이 걸리므로.. 차후 시간이 되면 제가 자료를 올려 드리도록 하겠습니다.
아무튼 Exists 는 서브쿼리의 결과가 ’참’, ’거짓’을 판단하여 리턴해 주는 것이기에
해당 조건을 만족하면 바로 빠져나와 버리죠.
글은 썼는데. 이해가 되실려는지는 잘 모르겠네요. ^^
Subquery 의 내용에 대해서는 대용량 책에 잘 나와 있습니다. 참조 하시면 될것 같네요. ^^
그럼. 수고하세요~~
ps.. 혹시 내용이 잘 못된 부분이 있으면.. 코멘트 남겨주세요. ^^;