12.1 버전에서 Native LEFT OUTER JOIN 동작이 개선되었다.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1-1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; DROP TABLE t3 PURGE; CREATE TABLE t1 AS SELECT LEVEL AS c1 FROM DUAL CONNECT BY LEVEL <= 3; CREATE TABLE t2 AS SELECT LEVEL AS c1 FROM DUAL CONNECT BY LEVEL <= 2; CREATE TABLE t3 AS SELECT LEVEL AS c1 FROM DUAL WHERE LEVEL <> 2 CONNECT BY LEVEL <= 3; -- 1-2 ---------- |T1|T2|T3| ---------- | 1| 1| 1| | 2| 2| | | 3| | 3| ----------
아래 쿼리는 11.2 버전까지는 에러가 발생하지만, 12.1 버전부터 t1, t3 테이블을 카티션 곱한 결과로 t2 테이블을 아우터 조인한다. 일반적으로 사용되는 패턴이 아니기 때문에 실수를 유발할 수 있는 불필요한 개선으로 생각된다.
-- 2-1 : 11.2 SELECT a.c1 AS ac1, b.c1 AS bc1, c.c1 AS cc1 FROM t1 a, t2 b, t3 c WHERE b.c1(+) = a.c1 AND c.c1 = b.c1(+) ORDER BY 1, 3; ORA-01417: 하나의 테이블은 하나의 다른 테이블과 포괄 조인할 수 있습니다 -- 2-2 : 12.1 SELECT a.c1 AS ac1, b.c1 AS bc1, c.c1 AS cc1 FROM t1 a, t2 b, t3 c WHERE b.c1(+) = a.c1 AND c.c1 = b.c1(+) ORDER BY 1, 3; AC1 BC1 CC1 --- --- --- 1 1 1 1 3 2 1 2 3 3 1 3 3 6 행이 선택되었습니다. -------------------------------------- | Id | Operation | Name | -------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN OUTER | | | 2 | MERGE JOIN CARTESIAN| | | 3 | TABLE ACCESS FULL | T3 | | 4 | BUFFER SORT | | | 5 | TABLE ACCESS FULL | T1 | | 6 | TABLE ACCESS FULL | T2 | --------------------------------------
'Oracle > SQL' 카테고리의 다른 글
다중 열 다중 행 스칼라 서브 쿼리 (0) | 2014.05.14 |
---|---|
파티션 확장 절 (0) | 2014.05.10 |
최종 변경 이력 조회 (0) | 2014.04.17 |
SQL ID 생성 (0) | 2013.09.24 |
최종 거래일이 1달 남은 ELW 만기일 조회 (0) | 2012.07.12 |