안녕하세요..오늘도 개발에 여념이 없는 개발자님들 화이팅입니다.
다름이 아니라 쿼리 실행결과 PLAN 결과가 두 종류가 있는데 어떤것이 좋은 방법인지 몰라서 고수님들께 의견을 듣고 싶습니다.
1번 쿼리
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=60)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'A TABLE'(TABLE) (Cost=2 Card=1 Bytes=47)
2 1 INDEX (RANGE SCAN) OF 'B INDEX' (INDEX (UNIQUE)) (Cost=1 Card=1)
3 0 TABLE ACCESS (BY INDEX ROWID) OF 'B TABLE' (TABLE) (Cost=2 Card=1 Bytes=60)
4 3 INDEX (RANGE SCAN) OF 'B INDEX' (INDEX (UNIQUE)) (Cost=1 Card=1)
5 0 TABLE ACCESS (BY INDEX ROWID) OF 'B TABLE' (TABLE) (Cost=2 Card=1 Bytes=49)
6 5 INDEX (RANGE SCAN) OF 'B INDEX' (INDEX (UNIQUE)) (Cost=1 Card=1)
7 0 TABLE ACCESS (BY INDEX ROWID) OF 'B TABLE' (TABLE) (Cost=2 Card=1 Bytes=70)
8 7 INDEX (RANGE SCAN) OF 'B INDEX' (INDEX (UNIQUE)) (Cost=1 Card=1)
9 0 TABLE ACCESS (BY INDEX ROWID) OF 'A TABLE' (TABLE) (Cost=2 Card=1 Bytes=60)
10 9 INDEX (RANGE SCAN) OF 'A INDEX' (INDEX (UNIQUE)) (Cost=1 Card=1)
2번 쿼리
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=1 Bytes=194)
1 0 MERGE JOIN (CARTESIAN) (Cost=4 Card=1 Bytes=194)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'A TABLE' (TABLE) (Cost=2 Card=1 Bytes=60)
3 2 INDEX (RANGE SCAN) OF 'A INDEX' (INDEX (UNIQUE)) (Cost=1 Card=1)
4 1 BUFFER (SORT) (Cost=2 Card=2 Bytes=268)
5 4 TABLE ACCESS (BY INDEX ROWID) OF 'B TABLE' (TABLE) (Cost=2 Card=2 Bytes=268)
6 5 INDEX (RANGE SCAN) OF 'B INDEX' (INDEX (UNIQUE)) (Cost=1 Card=2)
고수님들께서는 위 PLAN 만 알 수 있겠지만
1번 쿼리는
SELECT A.AAA
,(SELECT BBB FORM B
WHERE INDEX = A.INDEX) AS BBB
,(SELECT BBC FORM B
WHERE INDEX = A.INDEX) AS BBC
FORM A
이런 식이고 2번 쿼리는
SELECT A.AAA
,B.BBB
,B.BBC
FORM A, B
WHERE A.INDEX = B.INDEX(+)
제 생각은 1번 쿼리는 유니크 인덱스를 타기 때문에 1번이 좋은거 같기도 하다가 SELECT 절이 너무 많기 때문에
오히려 2번이 좋은가 하는 생각이 들어서요.. 아시겠지만 B TABLE에는 데이터가 없을 수 있습니다.
고수님들 의견을 듣고 싶습니다.
감사합니다.
|