database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 4059 게시물 읽기
No. 4059
OUTER JOIN 에서 ON 조건에 관한 질문입니다.
작성자
질문자
작성일
2008-02-14 18:25ⓒ
2008-02-15 08:51ⓜ
조회수
4,004

LEFT OUTER JOIN 할 때 ON 에서 조건을 달리할 경우 내부 실행과정에 어떠한 차이가 있는지 궁금해서 질문을 드립니다.

사실 별 내용이 아닌데 자세히 적다보니 내용이 길어져버렸네요. 간단한 내용이니 한번씩만 봐주시고 조언 부탁드립니다. 감사합니다. ^^



다음과 같이 id라는 컬럼을 가진 두개의 테이블 aaa와 bbb가 있습니다.

[aaa]

id

1

2

3

4


[bbb]

id

1

2

5

6


위 테이블에 대해서 아래 두개의 쿼리의 실행과정에 어떠한 차이가 있는지 궁금합니다.

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 라는 조건이 추가되어 부하를 주게 될까요?


많은 조언 부탁드립니다.

감사합니다.
이 글에 대한 댓글이 총 2건 있습니다.

결과 부터 말씀드리면 성능은 모두 같습니다.
하지만 첫번째 문장을 사용하는게 맞습니다.

실행 계획을 보면 셋 다

 |--Nested Loops(Left Outer Join)
       |--Table Scan(OBJECT:([otooi].[dbo].[aaa]), WHERE:([aaa].[id]=1))
       |--Table Scan(OBJECT:([otooi].[dbo].[bbb]), WHERE:([bbb].[id]=1))

이런 실행 계획이 나옵니다.

다만 2번과 3번 같은 경우 문법상 오류가 생길수 있습니다.

ON aaa.id = 1 AND bbb.id = 1

이런식의 문법은 경우에 따라 inner join 처럼 처리가 되서 잘못된 결과가 나올수 있습니다.

SELECT *
FROM aaa LEFT OUTER JOIN bbb ON aaa.id = 1 AND bbb.id = 1
WHERE aaa.id = 1

--> 위의 문장은 아래처럼 바꿔서 사용하는게 문법상 맞습니다만
      원래 원하신 의미하고는 달라지죠.

SELECT
       *
FROM
       (SELECT * FROM aaa WHERE id = 1) A
LEFT OUTER JOIN
       (SELECT * FROM bbb WHERE id = 1) B
       ON A.id = B.id
재웅님이 2008-02-15 10:23에 작성한 댓글입니다. Edit

답변 감사드립니다.

많은 도움이 되었습니다. ^^

질문자님이 2008-02-15 14:39에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4063로그인 정보를 셀렉트하는중............................도움부탁드립니다. [1]
박인규
2008-02-15
3246
4062어찌해야할지 [3]
어찌
2008-02-15
3327
4060사용자 권한 설정에 관해서 질문 올립니다.
이기성
2008-02-15
3399
4059OUTER JOIN 에서 ON 조건에 관한 질문입니다. [2]
질문자
2008-02-14
4004
4058insert에 관해서 질문 드립니다.
정명규
2008-02-13
3236
4057not exists 에 관한 쿼리... [1]
손님
2008-02-12
3573
4056MS-SQL2005 엔진만 설치... [1]
박영조
2008-02-12
3047
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다