- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=1966212&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
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를 참고했습니다.
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=1966212&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.