TheBest

블로그 이미지
단군의 후예이길 거부하는자 .. 꺼져주시길
by InsertCoin

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

기존의 조인방식들로 수행하면서 단지 조인의 실행계획이 특정한 절차로 수행되는 것 뿐이다.


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) --------------------------------------------------- (c)
   TABLE ACCESS (FULL) OF 'PRODUCTS'
 TABLE ACCESS (FULL) OF 'SALES'

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

AND

ARTICLE CATEGORY

분류 전체보기 (131)
공지사항 (2)
JAVA (1)
ORACLE (12)
기타 (15)
JSP (1)
flash (7)
자존심의이유 (36)
secret (0)
좋은글 모음 (34)
UNIX (2)
민가 (21)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

ARCHIVE

LINK