09 Outer 조인을 Inner 조인으로 변환

select *
from emp e , dept d
where d.deptno(+) = e.deptno
and d.loc = 'DALLAS'
and e.sal >= 1000

------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                |     5 |   285 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID  | EMP            |     5 |   185 |     1   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                |                |     5 |   285 |     3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DEPT           |     1 |    20 |     2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | DEPT_IDX       |     1 |       |     1   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN           | EMP_DEPTNO_IDX |     5 |       |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("E"."SAL">=1000)
   4 - access("D"."LOC"='DALLAS')
   5 - access("D"."DEPTNO"="E"."DEPTNO")

  • OUTER 조인은 (+)기호 붙지 않는 쪽으로 고정된다. OUTER 해시 조인의 경우 10g부터 자유롭게 조인 순서가 바뀌도록 개선이되었지만 10g 이전 버전에서는 자유롭게 결정하지 못하였다.
  • 만약 e.sal >= 1000 조건에 레코드가 매우 많고 d.loc='DALLAS' 조건에 레코드가 적으면 dept 테이블을 먼저 드라이빙하는 것이 유리하다.
  • 그럼에도 Outer 조인 때문에 항상 emp 테이블을 드라이빙해야 한다면 불리한 조건에서 최적화하기 때문에 Outer조인을 삼가해야 된다.
  • Outer 조인을 써야하는 상황이라면 Outer 기호를 정확히 구사해야 올바른 결과 집합을 얻을 수 있음에 유념하자
  • ANSI Outer 조인문일때는 Outer 기호 대신 조건절 위치에 신경써야 한다.

select *
from dept d left outer join emp e on d.deptno = e.deptno
where e.sal > 1000

  • 제대로 된 Oter 조인 결과집합을 얻으려면 sal > 1000 조건을 아래와 같이 on절에 기술

select *
from dept d left outer join emp e on d.deptno = e.deptno and e.sal > 1000

  • ANSI Outer 조인문에서 where 절에 기술한 조건이 의미 있게 사용되는 경우는 is null 조건 체크

select *
from dept d left outer join emp e on d.deptno = e.deptno
where e.empno is null

  • Outer 필터조건은 on절에 기술하든 where 절에 기술하든 결과 집합이나 성능에 하등에 차이가 없다.