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