pq_distribute 힌트의 용도 

 - pq_distribute 힌트를 사용함으로써 옵티마이저의 선택을 무시하고 사용자가 직접 조인을 위한 

   데이터 분배 방식을 결정할 수 있다. 

    ● 옵티마이져가 파티션된 테이블을 적절히 활용하지 못하고 동적 재분할을 시도할 때 

    ● 기존 파티션 키를 무시하고 다른 키 값으로 동적 재분할하고 싶을 때 

    ● 통계정보가 부정확하거나 통계정보를 제공하기 어려운 상황에서 실행계획을 

        고정시키고자 할 때 

    ● 기타 여러 가지 이유로 데이터 분배 방식을 변경하고자 할 때

 - 병렬 쿼리는 '분할&정복 원리'에 기초한다. 그 중에서도 병렬 조인을 위해서는 

    '분배&조인 원리'가 작동함을 이해하는 것이 매우 중요하다. 이때, pq_distribute 힌트는 

    조인에 앞서 데이터를 분배하는 과정에만 관여하는 힌트임을 반드시 기억할 필요가 있다. 

 - pq_distribute 힌트는 병렬 조인에 앞선 사전 정지 작업으로서 데이터를 어떻게 분배할지를 

   결정하는 힌트지, 조인 방식을 결정하는 힌트가 아니다. 


구문 이해하기 

 - pq_distribute 힌트의 사용법 

   /*+PQ_DISTRIBUTE ( table, outer_distribution, inner_distribution) */ 

                          1. inner 테이블명  2.outer 테이블의   3. inner 테이블의 

                                또는 alias        distribution 방식    distribution 방식                                                                                    


분배방식 지정 

 - 분배 방식의 종류 

    ● pq_distribute (inner, none, none )

         - Full-Partition Wise 조인으로 유도할 때 사용한다. 당연히, 양쪽 테이블 모두 조인 컬럼에 

           대해 같은 기준으로 파티셔닝 돼 있을 때만 작동한다. 

    ● pq_distribute (inner, partition, none )

         - Partial-Partition Wise 조인으로 유도할 때 사용하며, outer 테이블을 inner 테이블 파티션 

           기준에 따라 파티셔닝하라는 뜻이다.

           당연히, inner 테이블이 조인 키 컬럼에 대해 파티셔닝 돼 있을 때만 작동한다. 

    ● pq_distribute (inner, none, partition )

         - Partial-Partition Wise 조인으로 유도할 때 사용하며, inner 테이블을 outer 테이블 

           파티션 기준에 따라 파티셔닝하라는 뜻이다. 당연히, outer 테이블이 조인 키 컬럼에 

           대해 파티셔닝 돼 있을 때만 작동한다. 

    ● pq_distribute (inner, hash, hash )

         - 조인 키 컬럼을 해시 함수에 적용하고 거기서 반환된 값을 기준으로 양쪽 테이블을 

           동적으로 파티셔닝하라는 뜻이다. 

    ● pq_distribute (inner, broadcast, none )

         - outer 테이블을 Broadcast 하라는 뜻이다. 

    ● pq_distribute (inner, none, broadcast )  

         - inner 테이블을 Broadcast 하라는 뜻이다. 


pq_distribute 힌트를 이용한 튜닝 사례 

 - 통계 정보가 없는 상태에서 병렬 조인하면 옵티마이저가 아주 큰 테이블을 Broadcast 하는 

   경우를 종종 보게 된다. 임시 테이블을 많이 사용하는 야간 배치나 데이터 이해 프로그램에서 

   그런 문제가 자주 발생하는 이유가 여기에 있다. 

 - 10g부터는 통계정보가 없을 때 동적 샘플링이 일어나므로 그럴 가능성이 매우 낮아졌다. 

   하지만 테이블 간 조인을 여러 번 거치면 옵티마이저가 예상한 조인 카디널리티가 점점 

   부정확해지게 마련이다. 

 - 데이터 분포가 고르지 않은 컬럼이 조건절에 많이 사용되거나, 다른 테이블과 조인되기 전

   인라인 뷰 내에서 많은 가공이 이루어져 정확한 카디널리티 계산이 어려울 때 이런 오류 

   발생 가능성은 더욱 커진다. 

+ Recent posts