LEFT OUTER JOIN 할 때 ON 에서 조건을 달리할 경우 내부 실행과정에 어떠한 차이가 있는지 궁금해서 질문을 드립니다.
사실 별 내용이 아닌데 자세히 적다보니 내용이 길어져버렸네요. 간단한 내용이니 한번씩만 봐주시고 조언 부탁드립니다. 감사합니다. ^^
다음과 같이 id라는 컬럼을 가진 두개의 테이블 aaa와 bbb가 있습니다.
[aaa]
[bbb]
위 테이블에 대해서 아래 두개의 쿼리의 실행과정에 어떠한 차이가 있는지 궁금합니다.
1번.
SELECT *
FROM aaa LEFT OUTER JOIN bbb ON aaa.id = bbb.id
WHERE aaa.id = 1
2번.
SELECT *
FROM aaa LEFT OUTER JOIN bbb ON aaa.id = 1 AND bbb.id = 1
WHERE aaa.id = 1
제가 생각할 때, 처리순서는..
1번은 aaa.id 와 bbb.id 가 같은 것들을 INNER JOIN 한 후에 매핑되지 않은 aaa.id 에 대해 NULL 을 할당하기 때문에
->
INNER JOIN 의 대상이 aaa.id 2개(id = 1, 2) bbb.id 2개(id = 1, 2)가 되어, INNER JOIN 결과 4Row
INNER JOIN 의 대상이 안된 aaa.id 2개(id = 3, 4)에 NULL 이 할당되어 2Row
: 합이 총 6개 Row 인데 여기에서 WHERE 조건에 해당하는 1Row 가 출력되고
2번은 aaa.id = 1인 것과 bbb.id = 1인 것들을 INNER JOIN 한 후에 매핑되지 않은 aaa.id 에 대해 NULL 을 할당하기 때문에
->
INNER JOIN 의 대상이 aaa.id 1개(id = 1) bbb.id 1개(id = 1)가 되어, INNER JOIN 결과 1Row
INNER JOIN 의 대상이 안된 aaa.id 3개(id = 1, 2, 3)에 NULL 이 할당되어 3Row
: 합이 총 4개 Row 인데 여기에서 WHERE 조건에 해당하는 1Row 가 출력
제 생각이 맞다면 1번보다 2번 쿼리의 성능이 더 좋을까요?
그리고 만약 1번과 2번을 절충해서 다음과 같은 쿼리를 만든다면 어떨지 궁금합니다..
3번.
SELECT *
FROM aaa LEFT OUTER JOIN bbb ON aaa.id = bbb.id AND aaa.id = 1 AND bbb.id = 1
WHERE aaa.id = 1
2번과 같은 수행과정을 거치게 되겠지만 INNER JOIN 의 대상을 검색할 때,
괜히 aaa.id = bbb.id 라는 조건이 추가되어 부하를 주게 될까요?
많은 조언 부탁드립니다.
감사합니다. |