시소당
여러 테이블을 조인할 때 Where구문의 테이블 순서와 컬럼의 상수값의 위치에 따라 실행계획이 달라질 수 있다.
- 납품실행계획a (부서번호#, 주문번호#, 직원번호#) :가장건수가 많다.
- 주문b (주문번호#)
- 고객d (고객번호#)
- 수주진행현황c (회사번호#, 부서번호#, 주문번호#, 주문일자#, 고객번호#)
select distinct a.부서번호, a.주문번호, b.주문일자, b.직원번호, b.고객번호, d.출고중지구분
from 납품실행계획a, 주문b, 고객d, 수주진행현황 c
where c.부서번호 = b.부서번호 and c.고객번호 = b.고객번호
and c.직원번호 = b.직원번호 and c.주문번호 = b.주문번호
and c.주문일자 = b.주문일자
and a.부서번호 = b.부서번호 and a.주문번호 = b.주문번호
and a.주문일자 = b.주문일자 and a.완료여부 is null
and c.고객번호 = d.고객번호
and c.부서번호 = 3000 and c.회사번호 = 3;
 상수가 결정적으로 데이터 양을 줄일 수 있기 때문에 다음과 같이 조인 순서를 조정한다.
select /*+ordered */
distinct a.부서번호, a.주문번호, b.주문일자, b.직원번호, b.고객번호, d.출고중지구분
from 수주진행현황 c, 납품실행계획 a, 고객 d, 주문 b
(c의 범위를 줄여서 드라이빙 테이블로 이용한다.)
where c.부서번호 = b.부서번호 and c.고객번호 = b.고객번호
and c.직원번호 = b.직원번호 and c.주문번호 = b.주문번호
and c.주문일자 = b.주문일자
and a.부서번호 = c.부서번호
and a.주문번호 = c.주문번호
and a.주문일자 = c.주문일자
and a.완료여부 is null
and c.고객번호 = d.고객번호
and c.부서번호 = 3000 and c.회사번호 = 3;