by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

1. 단계적인 조인을 위한 활용




3장. 인라인뷰의 활용

인라인뷰란?
  • FROM절에 오는 서브쿼리로 최종집합을 만들어내기 위한 중간집합이다.
인라인뷰의 남용
  • 절차적 사고에 젖어있는 개발자에겐 인라인뷰로 만들어내지 못할 집합은 없다.
    1차로 생성해둔 집합에 추가적인 처리를 하고 싶으면 괄호로 묶어
    인라인뷰로 만들어 다른 집합과 조인하거나 2차 가공처리에 들어간다.
    여기에 또다른 처리가 있으면 UNION을 하거나 조인을 하고,
    또다시 인라인뷰를 만들어 가면서 쿼리는 소설이 되고 만다.
  • 되도록이면 절차적쿼리인 인라인뷰를 줄이고 한번에 처리하는 것이 좋다.
인라인뷰의 활용
  • 그러나, 이장에서 배울 내용은 제목 그대로 인라인뷰의 활용이다.
    인라인뷰가 반드시 필요한 경우 어떻게 사용되어야 하는지를 고민해보자.

1. 조인을 뒤로 미루자. => 조인 처리비용의 감소

  • 조건을 만족하는 sale의 갯수가 총 10,000건 20개 부서라면
    
    -- 총 10,000회의 조인이 발생
    SELECT y.dept_name
         , SUM(x.sale_qty) s_qty
         , SUM(x.sale_amt) s_amt
      FROM sale x
         , dept y
     WHERE x.dept_cd = y.dept_cd
       AND x.yymm = :in_date
       AND x.saup = :saup
     GROUP BY y.dept_name
    ;
    
    구분 수정전 수정후 개선효과
    조인 10,000회 20회 9980회
    
    -- 총 20회의 조인이 발생
    SELECT y.dept_name
         , x.s_qty
         , x.s_amt
      FROM (SELECT dept_cd
                 , SUM(sale_qty) s_qty
                 , SUM(sale_amt) s_amt
              FROM sale
             WHERE yymm = :in_date
               AND saup = :saup
             GROUP BY dept_cd
            ) x
         , dept y
     WHERE x.dept_cd = y.dept_cd
    ;
    

2. 한번에 처리하는 것이 능사가 아니다. => 함수 사용 비용의 감소

  • 조건을 만족하는 sale의 갯수가 총 10,000건 20개 부서라면
    SELECT dept_cd
         , SUM(DECODE(SUBSTR(sale_date,7,2),'01',sale_qty)) s_01
         , SUM(DECODE(SUBSTR(sale_date,7,2),'02',sale_qty)) s_02
         , .....................................................
         , SUM(DECODE(SUBSTR(sale_date,7,2),'30',sale_qty)) s_30
         , SUM(DECODE(SUBSTR(sale_date,7,2),'31',sale_qty)) s_31
      FROM sale
     WHERE yymm = :in_date
       AND saup = :saup
     GROUP BY dept_cd
    ;
    
    구분 수정전 수정후 개선효과
    Decode 10,000행 * 31개 (20 * 31)행 * 31개 31만 ==> 19,220
    Substr 10,000행 * 31개 10,000행 31만 ==> 1만
    Group by 10,000행 10,000행 + (20 * 31)행 10,000 ==> 10,620
    SELECT dept_cd
         , SUM(DECODE(dd,'01',s_qty)) s_01
         , SUM(DECODE(dd,'02',s_qty)) s_02
         , ...............................
         , SUM(DECODE(dd,'30',s_qty)) s_30
         , SUM(DECODE(dd,'31',s_qty)) s_31
     FROM (SELECT dept_cd
                , SUBSTR(sale_date,7,2) dd
                , SUM(sale_qty) s_qty
             FROM sale
            WHERE yymm = :in_date
              AND saup = :saup
            GROUP BY dept_cd, SUBSTR(sale_date,7,2)
           )
     GROUP BY dept_cd
    ;
    

About Doc.

  • 최초작성자 : 기민용
  • 최초작성일 : 2009년 5월 7일
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • 이 문서의 내용은 이화식님의 대용량 데이터베이스 솔루션2를 참고했습니다.

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.