본문 바로가기

프로그래밍/oracle

oracle - [Hint]조인순서 변경(STAR)

반응형

[Hint]조인순서 변경(STAR)


STAR힌트는 간단히 star query plan을 이용할 수 있게 하는 힌트인데 여기서 STAR QUERY PLAN이란 거대한 테이블이 조인 순서상 마지막이 되며 조인을 하는 경우 거대 테이블의 결합인덱스가 이용되는 중첩 루프 구조를 보이는 것입니다. (참고로 STAR QUERY PLAN은 DW에서 많이 사용되는 다차원 모델 구조 입니다.)


예를 들어 품목 테이블이 있고 매출실적 테이블이 있다고 했을 때 품목 테이블과 같은 것을 Dimension Table이라 하는데 이러한 테이블로는 Employee(사원), Department(부서)와 같은 것들이 있습니다. 한편 매출실적 테이블과 같은 형태의 테이블을 FACT TABLE이라 하는데 이러한 STAR SCHEMA 구조에서 FACT TABLE은 대량의 데이터를 가지게 됩니다…


참고로 STAR SCHEMA한 하나의 FACT TABLE이 중앙에 있고 나머지 Dimension Table이 여러 개 존재하면서 마치 STAR 처럼 보이는 Schema를 말하는 것이죠~


아래 링크의 그림을 보시면 STAR SCHEMA가 어떤 것인지 이해가 되실겁니다 ^^

http://web.umr.edu/~ora9i/server.901/a90237/dwg81007.gif


ERD의 모양을 생각해 보면 Dimension Table들에서 Fact 테이블로 까치발을 내리는 모양으로 생각할 수 있습니다. FACT TABLE에는 Dimension Table과 조인하기 위한 외래 키 등이 존재하며 대부분 결합인덱스가 걸려져 있는 구조 일겁니다. 물론 STAR QUERY가 제대로 동작하기 위해서는 적어도 3개 이상의 테이블이 연관되어 있어야 하며 FACT TABLE에 3개 이상의 컬럼으로 구성된 결합 인덱스가 존재해야 합니다.


STAR QUERY를 효율적으로 실행하기 위해서는 CBO 기반으로 동작해야 하며 Analyze 명령으로 통계정보가 생성되어 있어야 합니다.



[형식]

Select /*+ STAR */ column1…




다음과 같은 Query를 볼까요…


SELECT SUM(dollars) 

  FROM facts, time, product, market 

  WHERE market.stat = 'New York' 

    AND product.brand = 'MyBrand' 

    AND time.year = 1995 

    AND time.month = 'March' 

    /* Joins*/ 

    AND time.key = facts.tkey 

    AND product.pkey = facts.pkey 

    AND market.mkey = facts.mkey;



STAR PLAN을 위해 FROM절 다음에 Dimension Table을 먼저 위치 시키며… 맨 마지막엔 대량의 데이터를 가지는 FACT 테이블을 위치 시킵니다. 그리고 FROM절 다음에 나타나는 Dimension Table의 순서는 FACT TABLE의 결합인덱스 순서와 일치 시키시구요…


물론 다음과 같은 힌트를 사용하는 것도 가능하지만, 

/*+ ORDERED USE_NL(facts) INDEX(facts fact_concat) */ 


보다 일반적인 방법은 STAR HINT를 사용하는 것입니다. 

/*+ STAR */. 


아래에서 facts 테이블은 tkey ,pkey, mkey 순서로 결합인덱스가 구성되어 있으며 FROM절 다음에 나타나는 Dimension Table의 순서가 time, product, market 의 순입니다.

SELECT /*+ STAR */

SUM(dollars) 

  FROM time, product, market, facts 

  WHERE market.stat = 'New York' 

    AND product.brand = 'MyBrand' 

    AND time.year = 1995 

    AND time.month = 'March' 

    /* Joins*/ 

    AND time.key = facts.tkey 

    AND product.pkey = facts.pkey 

    AND market.mkey = facts.mkey; 


수행속도는 대부분의 경우 STAR HINT를 사용한 것이 우수합니다…

 

 

 

 


반응형