3.3.5. 병렬처리 관련 힌트

PARALLEL

 예) SQL>CREATE TABLE table1( code number(7), name varchar(20),...) parallel 20;
     SQL>CREATE INDEX table1_index on table1(code) parallel 20; 
 예) SELECT /*+ FULL(sales) PARALLEL(sales) */
          SUBSTR(sale_dt,1,6), SUM(qty)
     FROM sales
     WHERE sale_dt BETWEEN '20030101' AND '20051231'
     GROUP BY SUBSTR(sale_dt,1,6);
   SELECT /*+ FULL(sales) PARALLEL(sales, 8) */
          SUBSTR(sale_dt,1,6), SUM(qty)
   FROM sales
   WHERE sale_dt BETWEEN '20030101' AND '20051231'
   GROUP BY SUBSTR(sale_dt,1,6);
   

NOPARALLEL

예) SELECT /*+ NOPARALLEL(m) */ member_name
     FROM member m;
     

PQ_DISTRIBUTE

표현 방식: /*+ PQ_DISTRIBUTE(table, outer_distribution,inner_distribution) */
           *outer_distribution: 외측 테이블에 대한 할당 방법을 기술
           *inner_distribution: 내측 테이블에 대한 할당 방법을 기술
할당방법:
	    * HASH: 조인 키 컬럼에 대해 해쉬 함수를 수행한 결과값을 이용하여 소비자 프로세스에 로우들을 할당
	    * BROADCAST: 외측 테이블에 전체 로우를 모든 Consumer 프로세스로 보냄 
	    * PARTITON: 상대편 조인 대상 테이블이 조인 키 컬럼으로 파티션되어 있는 경우 파티션 키 값을 
                        이용하여 로우들을 Consumer프로세스에 할당
	    * NONE: 조인 대상 로우들을 랜덤하게 파티셔닝함 
 예) SELECT /*+ ORDERED PQ_DISTRIBUTE(b HASH,HASH) USE_HASH(b) */.....
   FROM TAB1 a, TAB2 b
 WHERE a.col1 = b.col2;
    SELECT /*+	PQ_DISTRIBUTE(b BROADCAST, NONE) USE_HASH(b) */..........
 FROM TAB1 a, TAB2 b
 WHERE a.col1 = b.col2;

PARALLEL_INDEX

파티션 인덱스(Partitioned Index)에 대한 인덱스 범위 스캔을 병렬로 수행하기 위한 병렬도를 지정하는 힌트이다.

예) SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */..........

NOPARALLEL_INDEX

인덱스 생성(Create)이나 변경(Alter)에 의해 PARALLEL 파라메터가 적용되어 있는 경우 SQL에서 이 힌트를 적용하면 옵티마이져는 해당 인덱스에 대한 PARALLEL 파라메터를 무시하여 범위스캔을 하지 않게 된다.

예) SELECT /*+ NOPARALLEL_INDEX(m mem_join_idx) */....
     FROM members m
     WHERE join_date BETWEEN '20040101' AND '20051231';

NOPARALLEL_INDEX힌트는 버전에 따라 NO_PARALLEL_INDEX힌트로 대체되어 사용되기도 한다.

Oracle버전별 NOPARALLEL_INDEX Hint

 [Oracle9iR2] (NOPARALLEL_INDEX)
 [Oracle10gR2],11gR1 (NO_PARALLEL_INDEX)
참조한문서

“오라클클럽” http://wiki.oracleclub.com/pages/viewpage.action?pageId=1966261&