h1.PQ_DISTRIBUTE 힌트

h3.PQ_DISTRIBUTE 힌트의 용도

  • 옵티마이저의 선택이 최적이라고 판단되지 못할때 옵티마이저의 선택을 무시하고 사용자가 직접 조인을 위한 데이터 분배방식을 결정할때 사용된다.

1. 옵티마이져가 파티션된 테이블을 적절히 활용하지 못하고 동적 재분할을 시도할 때
2. 기존 파티션 키를 무시하고 다른 키 값으로 동적 재분할하고 싶을 때
3. 통계정보가 부정확하거나 통계정보를 제공하기 어려운 상황에서 실행계획을 고정시키고자 할 때
4. 기타 여러 가지 이유로 데이터 분배 방식을 변경하고자 할 때

  • PQ_DISTRIBUTE 힌트는 조인에 앞서 데이터를 분배 과정에만 관여하는 힌트임을 기억하여야 한다.
    (일반적으로 사용되는 HINT의 경우 옵티마이저의 실행계획을 수립하는데 있어 관여를 하게된다.)

SQL> SELECT /*+ gather_plan_statistics LEADING( D ) USE_MERGE( E ) FULL( D ) FULL ( E ) PARALLEL(D 4) PARALLEL(E 4) PQ_DISTRIBUTE(E ,HASH, HASH ) */COUNT(*)
  2    FROM DEPT_NOPARTITION D, EMP_NOPARTITION E
  3  WHERE E.DEPTNO = D.DEPTNO;

  COUNT(*)
----------
   4000000

SQL> @XPLAN

----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name             | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem | Used-Tmp|
----------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  SORT AGGREGATE            |                  |      1 |      1 |      1 |00:00:10.91 |       8 |       |       |          |         |
|   2 |   PX COORDINATOR           |                  |      1 |        |      4 |00:00:10.80 |       8 |       |       |          |         |
|   3 |    PX SEND QC (RANDOM)     | :TQ10002         |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |         |
|   4 |     SORT AGGREGATE         |                  |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |         |
|   5 |      MERGE JOIN            |                  |      0 |   2888K|      0 |00:00:00.01 |       0 |       |       |          |         |
|   6 |       SORT JOIN            |                  |      0 |      4 |      0 |00:00:00.01 |       0 |  2048 |  2048 | 2048  (0)|         |
|   7 |        PX RECEIVE          |                  |      0 |      4 |      0 |00:00:00.01 |       0 |       |       |          |         |
|   8 |         PX SEND HASH       | :TQ10000         |      0 |      4 |      0 |00:00:00.01 |       0 |       |       |          |         |
|   9 |          PX BLOCK ITERATOR |                  |      0 |      4 |      0 |00:00:00.01 |       0 |       |       |          |         |
|* 10 |           TABLE ACCESS FULL| DEPT_NOPARTITION |      0 |      4 |      0 |00:00:00.01 |       0 |       |       |          |         |
|* 11 |       SORT JOIN            |                  |      0 |   2888K|      0 |00:00:00.01 |       0 |    69M|  2879K|   21M (1)|   16384 |
|  12 |        PX RECEIVE          |                  |      0 |   2888K|      0 |00:00:00.01 |       0 |       |       |          |         |
|  13 |         PX SEND HASH       | :TQ10001         |      0 |   2888K|      0 |00:00:00.01 |       0 |       |       |          |         |
|  14 |          PX BLOCK ITERATOR |                  |      0 |   2888K|      0 |00:00:00.01 |       0 |       |       |          |         |
|* 15 |           TABLE ACCESS FULL| EMP_NOPARTITION  |      0 |   2888K|      0 |00:00:00.01 |       0 |       |       |          |         |
----------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  10 - access(:Z>=:Z AND :Z<=:Z)
  11 - access("E"."DEPTNO"="D"."DEPTNO")
       filter("E"."DEPTNO"="D"."DEPTNO")
  15 - access(:Z>=:Z AND :Z<=:Z)

Note
-----
   - dynamic sampling used for this statement


39 개의 행이 선택되었습니다.

PQ_DISTRIBUTE 힌트는 병렬 조인에 앞선 사전 정지 작업으로서 데이터를 어떻게 분배할지를 결정하는 힌트지, 조인 방식을 결정하는 힌트가 아니다.

h3.구문 이해하기

/*+ PQ_DISTRIBUTE( TABLE, OUTER_DISTRIBUTION, INNER_DISTRIBUTION ) */

여기 구문이해 jpg

분배방식 지정

PQ_DISTRIBUTE( Inner, none, none )
  • Full-Partition Wise 조인으로 유도할 때 사용한다. 다연히, 양쪽 테이블 모두 조인 컬럼에 대해 같은 기준으로 파티셔닝( equi-partitioning ) 돼 있을 때만 작동한다.
PQ_DISTRIBUTE( Inner, partition, none )
  • Partial-Partition Wise 조인으로 유도할 때 사용하며, outer 테이블을 inner 테이블 파티션기준에 따라 파티셔닝하라는 뜻이다.
    당연히, inner 테이블이 조인 키 컬럼에 대해 파티셔닝 돼 있을 때만 작동한다.
PQ_DISTRIBUTE( Inner, none, partition )
  • Partial-Partition Wise 조인으로 유도할 때 사용하며, inner 테이블을 outer 테이블 파티션기준에 따라 파티셔닝 하라는 뜻이다.
PQ_DISTRIBUTE( Inner, hash, hash )
  • 조인 키 컬럼을 해시 함수에 적용하고 거기서 반환된 값을 기준으로 양쪽 테이블을 동적으로 파티셔닝 하라는 뜻이다.
PQ_DISTRIBUTE( innert, broadcast, none )
  • outer 테이블을 Boardcast 하라는 뜻이다.
PQ_DISTRIBUTE( inner, none, broadcast )
  • inner 테이블을 Broadcast 하라는 뜻이다.