예) 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);
예) SELECT /*+ NOPARALLEL(m) */ member_name FROM member m;
표현 방식: /*+ 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;
파티션 인덱스(Partitioned Index)에 대한 인덱스 범위 스캔을 병렬로 수행하기 위한 병렬도를 지정하는 힌트이다.
예) SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */..........
인덱스 생성(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)