대용량 데이터베이스솔루션 2 (2009년)
단계적인 조인을 위한 활용 0 0 5,319

by 구루비 인라인뷰 [2009.05.06]


3장. 인라인뷰의 활용

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

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

  • 조건을 만족하는 sale의 갯수가 총 10,000건 20개 부서라면
    {section}
    {column:width=10}

-- 총 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회
{column}
{column:width=10}
{code:SQL}
-- 총 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
;
{code}
{column}
{column}{column:width=80}{column}
{section}

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

  • 조건을 만족하는 sale의 갯수가 총 10,000건 20개 부서라면
    {section}
    {column:width=10}

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
;

구분수정전수정후개선효과Decode10,000행 * 31개(20 * 31)행 * 31개31만 ==> 19,220Substr10,000행 * 31개10,000행31만 ==> 1만Group by10,000행10,000행 + (20 * 31)행10,000 ==> 10,620
{column}
{column:width=10}
{code:SQL}
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
;
{code}
{column}
{column}{column:width=80}{column}
{section}

About Doc.

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

- 강좌 URL : http://www.gurubee.net/lecture/2537

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입