2.3.6. 스타(Star) 조인

기존의 조인방식들로 수행하면서 단지 조인의 실행계획이 특정한 절차로 수행되는 것 뿐이다.
SELECT d.dept_name , c.country_name, p.product_name, t.type_name,
       SUM(s.sales_amount) sales_amount
FROM   SALES s, COUNTRY c, PRODUCTS p, DEPT d, TYPES t
WHERE  c.country_cd  = s.country_cd
  AND  p.product_cd  = s.product_cd                           
  AND  d.dept_no  = s.sales_dept                           
  AND  t.type_cd  = s.sales_type                            
  AND  s.sales_date between '20051001' and '20051231'                           
  AND  p.product_name in ('PA001','DQ101')                           
  AND  t.type_name = 'DOMESTIC'
  AND  d.dept_name = 'SEOUL'
GROUP BY d.dept_name, c.country_name, p.product_name, t.type_name ;

이 SQL 이 가지고 있는 몇 가지 특징을 좀더 상세하게 살펴보도록 하겠다.
우선 처리범위를 줄일 수 있는 조건들이 여러 테이블에 분산되어 있다는 점에 유의 하자.
원래 조인이라는 것은 그것이 어떤 방식으로 수행되건 간에 순간에는 두 개의 집합끼리만
연결작업을 수행한다.
논리적으로 가장 이상적인 처리를 한번 생각해보자
 먼저 소량의 데이터를 가지고 있는 집합들이 힘을 모아 먼저 상수의 집합을 만들고,
그 결과를 일거에 SALES 테이블에 제공할 수만 있다면 대량의 데이터를 가진 SALES
테이블이 한 번만 연결작업을 수행하게 된다.
 그러나 이러한 이를 수행하기 위해서는 몇 가지 문제점을 반드시 해결해야 한다.

첫 번째는 SALES 테이블에 붙어있는 각각의 디멘전(Dimension, 차원) 테이블 간에는
릴레이션쉽이 없기 때문에 먼가 특별한 방법을 동원하지 않고서는 이들 같의
연결을 시도할 수 없다는 점이다.
==> 연결고리의 조건이 없다는 것을 다른 말로 하면 '무조건' 이다.
    무조건이라는 말에는 '조건이 없다'는 의미보다는 '언제나 성공'이라는 뜻이
    더 강하게 들어 있다.
    스타조인에서는 디멘전의 카티젼 곱이 지나치게 많은 집합을 만들지 않을 때만
    사용해야 한다.

두 번째 해결할 것은 비록 첫 번째 문제가 해결되어 상수값을 받게 되었다고 하더라도
이들을 최적화로 액세스할 수 있는 팩트 테이블에서 인덱스를 보유할 수 있느냐에 대한 문제이다.
===> 카티젼 곱의 집합은 이미 인덱스를 가질 수 없고, 팩트 테이블은 디멘전 테이블들의
     수많은 조합을 모두 감당할 인덱스를 미리 구성하기 어려우므로 인덱스를 사용하지
     않는 해쉬조인이나 Sort Merge 조인으로 수행하는 것이 바람직한 방법이다.

SELECT STATEMENT Optimizer=All_ROWs  \








-\- (a)
HASH JOIN  \












---\- (d)
 MERGE JOIN (CARTESIAN) \









--\- (b)
  TABLE ACCESS (FULL) OF 'DEPT'
  BUFFER (SORT) \











--\- ©
   TABLE ACCESS (FULL) OF 'PRODUCTS'
 TABLE ACCESS (FULL) OF 'SALES'

위의 실행계획에 대해 살펴보면
(a) 스타조인은 반드시 비용기준(Cost based) 옵티마이져 모드에서 수행되어야 한다.
    또한 통계정보를 생성해 주어야 작동할 수 있다. 원하는 실행계획이 생성되지
    않을 때는 /*START*/ 힌트를 적용한다.
(b) 디멘전 테이블들이 먼저 조인하여 카티젼 곱을 만들어 내는 것을 확인할 수 있다.
    이처럼 카티젼 곱을 생성하는 대부분의 경우는 Sort Merge 조인 형식으로 나타난다.   
© 카티젼 ?을 좀 더 효율적으로 생성하기 위해 정렬을 한 집합을 버퍼에 저장해
    두는 것을 보여주고 있다.
(d) 카티젼 곱으로 생성된 집합과 팩트 테이블인 SALES 테이블이 해쉬조인을 하고 있음을
   확인할 수 있다. 그러나, 이 단계가 항상 해쉬조인이 되는 것은 아니다. 어쩌면 이
   단계는 이미 스타조인의 문제가 아니다. 단지 준비된 두 개의 집합이 가장 효율적인
   조인형식을 선택하는 문제가 남아 있을 뿐이다.

문서에 대하여

  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 이화식님의 새로쓴 대용량 데이터베이스 솔루션을 참고했습니다.*
  • 이 문서를 다른 블로그나 홈페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^