SSISO Community

시소당

조인하는 테이블의 순서에 따른 차이

여러  테이블을  조인할  때  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;

780 view

4.0 stars