select *
from emp e , dept d
where d.deptno(+) = e.deptno
and d.loc = 'DALLAS'
and e.sal >= 1000
------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 250 |
|* 1 | TABLE ACCESS BY INDEX ROWID | EMP | 5 | 160 |
| 2 | NESTED LOOPS | | 5 | 250 |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 18 |
|* 4 | INDEX RANGE SCAN | DEPT_LOC_IDX | 1 | |
|* 5 | INDEX RANGE SCAN | EMP_DEPTNO_IDX | 5 | |
------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("E"."SAL">=1000)
4 - access("D"."LOC"='DALLAS')
5 - access("D"."DEPTNO"="E"."DEPTNO")
Outer NL 조인, Outer 소트 머지 조인 시 드라이빙 테이블은 항상 Outer 기호가 붙지 않은 쪽으로 고정된다.
Outer 해시 조인의 경우,1Og부터 자유롭게 조인 순서가 바뀌도록 개선(9i까지는 해시 조인도순서가 고정적)
sal >= 1000 조건에 부합하는 사원 레코드가 매우 많고, loc = 'DALLAS' 조건에 부합하는 부서에 속한 사원이 매우 적다면 dept 테이블블을 먼저 드라이빙하는 것이 유리
ANSI Outer 조인문일 때는 Outer 기호 대신 조건절 위치에 신경을 써야 한다.
select *
from dept d left outer join emp e on d.deptno = e.deptno
where e.sal > 1000
select *
from dept d left outer join emp e on d.deptno = e.deptno and e.sal > 1000