Oracle/SQL2014. 4. 19. 15:26
12.1 버전에서 Native LEFT OUTER JOIN 동작이 개선되었다.


테스트를 위해 아래와 같이 테이블을 생성하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 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 테이블을 아우터 조인한다. 일반적으로 사용되는 패턴이 아니기 때문에 실수를 유발할 수 있는 불필요한 개선으로 생각된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
-- 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
Posted by 정희락_