
-- 1. Oracle
SELECT /*+ FULL(O) PARALLEL(O 4) */ -- PARALLEL 힌트 사용 시 가급적 FULL 힌트도 같이 사용
COUNT★ 주문건수,
SUM(주문수량) 주문수량,
SUM(주문금액) 주문금액
FROM 주문 O
WHERE 주문일시 BETWEEN '20100101' AND '20101231';
-- 2. SQL Server
SELECT COUNT★ 주문건수
FROM 주문
WHERE 주문일시 BETWEEN '20100101' AND '20101231'
OPTION(MAXDOP 4)
-- SQL
SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOPARALLEL(D) PARALLEL(E 4) */
COUNT★,
MIN(SAL),
MAX(SAL),
AVG(SAL),
SUM(SAL)
FROM DEPT D,
EMP E
WHERE E.DEPTNO = D.DEPTNO
AND D.LOC = 'CHICAGO'
;
-- 실행계획
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 18 | 8 (13)| 00:00:01 | | | |
| 1 | SORT AGGREGATE | | 1 | 18 | | | | | |
| 2 | PX COORDINATOR | | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10002 | 1 | 18 | | | Q1,02 | P->S | QC (RAND) |
| 4 | SORT AGGREGATE | | 1 | 18 | | | Q1,02 | PCWP | |
|* 5 | HASH JOIN | | 5 | 90 | 8 (13)| 00:00:01 | Q1,02 | PCWP | |
| 6 | BUFFER SORT | | | | | | Q1,02 | PCWC | |
| 7 | PX RECEIVE | | 1 | 11 | 5 (0)| 00:00:01 | Q1,02 | PCWP | |
| 8 | PX SEND HASH | :TQ10000 | 1 | 11 | 5 (0)| 00:00:01 | | S->P | HASH |
|* 9 | TABLE ACCESS FULL| DEPT | 1 | 11 | 5 (0)| 00:00:01 | | | |
| 10 | PX RECEIVE | | 14 | 98 | 2 (0)| 00:00:01 | Q1,02 | PCWP | |
| 11 | PX SEND HASH | :TQ10001 | 14 | 98 | 2 (0)| 00:00:01 | Q1,01 | P->P | HASH |
| 12 | PX BLOCK ITERATOR | | 14 | 98 | 2 (0)| 00:00:01 | Q1,01 | PCWC | |
| 13 | TABLE ACCESS FULL| EMP | 14 | 98 | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
-------------------------------------------------------------------------------------------------------------------
-- 모니터링
Pll_Tree SID,Serial# Server# QCSID DEGREE S SPID MODULE PROGRA WAIT LCE SQL_TEXT
---------- ------------ -------- ------ ------ - -------- -------------------- ------ ------------------------------ ------- ------------------------------------------------------------
■+21785 21785,24411 Main 21785 A 66584990 SQL*Plus sw.exe PX Deq Credit: send blkd 1 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖2424 2424,11537 1 21785 4 A 41354360 SQL*Plus (P000) PX Deq Credit: send blkd 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖2850 2850,65135 2 21785 4 A 4064746 SQL*Plus (P001) PX Deq: Table Q Normal 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖3243 3243,8229 3 21785 4 A 7013862 SQL*Plus (P002) PX Deq: Table Q Normal 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖3632 3632,849 4 21785 4 A 5244324 SQL*Plus (P003) PX Deq: Table Q Normal 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖4057 4057,8575 1 21785 4 A 6817210 SQL*Plus (P004) PX Deq: Execution Msg 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖4458 4458,1683 2 21785 4 A 9962960 SQL*Plus (P005) PX Deq: Execution Msg 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖4861 4861,2147 3 21785 4 A 55706012 SQL*Plus (P006) PX Deq: Execution Msg 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
┖5253 5253,14527 4 21785 4 A 5113530 SQL*Plus (P007) PX Deq: Execution Msg 2 SELECT /*+ ORDERED USE_HASH(D) FULL(D) FULL(E) NOP
*/
SELECT /* + FULL(고객) PARALLEL(고객 4) */
*
FROM 고객
ORDER BY 고객명


-- 1. SQL
SELECT /*+ ORDERED USE_HASH(E) FULL(D) NOPARALLEL(D) FULL(E) PARALLEL(E 2) PQ_DISTRIBUTE(E BROADCAST NONE) */
*
FROM DEPT D,
EMP E
WHERE D.DEPTNO = E.DEPTNO
ORDER BY E.ENAME
;
-- 2. 실행계획
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 812 | 9 (12)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (ORDER) | :TQ10002 | 14 | 812 | 9 (12)| 00:00:01 | Q1,02 | P->S | QC (ORDER) |
| 3 | SORT ORDER BY | | 14 | 812 | 9 (12)| 00:00:01 | Q1,02 | PCWP | |
| 4 | PX RECEIVE | | 14 | 812 | 8 (0)| 00:00:01 | Q1,02 | PCWP | |
| 5 | PX SEND RANGE | :TQ10001 | 14 | 812 | 8 (0)| 00:00:01 | Q1,01 | P->P | RANGE |
|* 6 | HASH JOIN | | 14 | 812 | 8 (0)| 00:00:01 | Q1,01 | PCWP | |
| 7 | BUFFER SORT | | | | | | Q1,01 | PCWC | |
| 8 | PX RECEIVE | | 4 | 80 | 5 (0)| 00:00:01 | Q1,01 | PCWP | |
| 9 | PX SEND BROADCAST | :TQ10000 | 4 | 80 | 5 (0)| 00:00:01 | | S->P | BROADCAST |
| 10 | TABLE ACCESS FULL| DEPT | 4 | 80 | 5 (0)| 00:00:01 | | | |
| 11 | PX BLOCK ITERATOR | | 14 | 532 | 3 (0)| 00:00:01 | Q1,01 | PCWC | |
| 12 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00:00:01 | Q1,01 | PCWP | |
--------------------------------------------------------------------------------------------------------------------
;



| RANGE | ORDER BY 또는 SORT GROUP BY를 병렬로 처리할 때 사용 |
| HASH | 조인이나 HASH GROUP BY를 병렬로 처리할 때 사용 |
| BROADCAST | QC 또는 첫 번째 서버 집합에 속한 프로세스들이 각각 읽은 데이터를 두 번째 서버 집합에 속한 모든 병렬 프로세스에게 전송하는 방식 |
| KEY | 특정 칼럼을 기준으로 테이블 또는 인덱스를 파티셔닝할 때 사용하는 분배 방식 |
| ROUND-ROBIN | 파티션 키, 정렬 키, 해시 함수 등에 의존하지 않고 반대편 병렬 서버에 무작위로 데이터를 분배할 때 사용 |
SELECT /*+ ORDERED USE_MERGE(E) PARALLEL(D 4) PARALLEL(E 4) PQ_DISTRIBUTE(E HASH HASH) */
*
FROM DEPT D,
EMP E
WHERE E.DEPTNO = D.DEPTNO
;
------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 812 | 5 (20)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10002 | 14 | 812 | 5 (20)| 00:00:01 | Q1,02 | P->S | QC (RAND) |
| 3 | MERGE JOIN | | 14 | 812 | 5 (20)| 00:00:01 | Q1,02 | PCWP | |
| 4 | SORT JOIN | | 4 | 80 | 2 (0)| 00:00:01 | Q1,02 | PCWP | |
| 5 | PX RECEIVE | | 4 | 80 | 2 (0)| 00:00:01 | Q1,02 | PCWP | |
| 6 | PX SEND HASH | :TQ10000 | 4 | 80 | 2 (0)| 00:00:01 | Q1,00 | P->P | HASH |
| 7 | PX BLOCK ITERATOR | | 4 | 80 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 8 | TABLE ACCESS FULL| DEPT | 4 | 80 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
|* 9 | SORT JOIN | | 14 | 532 | 3 (34)| 00:00:01 | Q1,02 | PCWP | |
| 10 | PX RECEIVE | | 14 | 532 | 2 (0)| 00:00:01 | Q1,02 | PCWP | |
| 11 | PX SEND HASH | :TQ10001 | 14 | 532 | 2 (0)| 00:00:01 | Q1,01 | P->P | HASH |
| 12 | PX BLOCK ITERATOR | | 14 | 532 | 2 (0)| 00:00:01 | Q1,01 | PCWC | |
| 13 | TABLE ACCESS FULL| EMP | 14 | 532 | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
------------------------------------------------------------------------------------------------------------------


| PQ_DISTRIBUTE(INNER, NONE, NONE) | FULL-PARTITION WISE JOIN으로 유도할 때 사용하며, 양쪽 테이블 모두 조인 칼럼에 대해 같은 기준으로 파티셔닝(EQUI-PARTITIONING) 되어 있을 경우에만 작동 |
| PQ_DISTRIBUTE(INNER, PARTITION, NONE) | PARTIAL-PARTITION WISE JOIN으로 유도할 때 사용하며, OUTER 테이블을 INNER 테이블 파티션 기준에 따라 파티셔닝하라는 의미. INNER 테이블이 조인 키 칼럼에 대해 파티셔닝 돼 있을 때만 작동 |
| PQ_DISTRIBUTE(INNER, NONE, PARTITION) | PARTIAL-PARTITION WISE JOIN으로 유도할 때 사용하며, INNER 테이블을 OUTER 테이블 파티션 기준에 따라 파티셔닝하라는 의미. OUTER 테이블이 조인 키 칼럼에 대해 파티셔닝 돼 있을 때만 작동 |
| PQ_DISTRIBUTE(INNER, HASH, HASH) | 조인 키 칼럼을 해시 함수에 적용하고 거기서 반환된 값을 기준으로 양쪽 테이블을 동적으로 파티셔닝하라는 의미. 조인되는 테이블을 둘 다 파티셔닝해서 파티션 짝(PARTITION PAIR)을 구성하고서 PARTITION WISE JOIN을 수행 |
| PQ_DISTRIBUTE(INNER, BROADCAST, NONE) | OUTER 테이블을 BROADCAST 하라는 의미 |
| PQ_DISTRIBUTE(INNER, NONE, BROADCAST) | INNER 테이블을 BROADCAST 하라는 의미 |
INSERT /*+ APPEND */ INTO 상품기본이력 (...)
SELECT /*+ PARALLEL(A,32) PARALLEL(B,32) PARALLEL(C,32) PARALLEL(D,32) */
.....
FROM 상품기본이력임시 A,
상품 B,
코드상세 C,
상품상세 D
WHERE A.상품번호 = B.상품번호
AND .....
/
INSERT /*+ APPEND */ INTO 상품기본이력 (
*
1행에 오류:
ORA-12801: 병렬 질의 서버 P013 에 오류신호가 발생했습나다.
ORA-01652: 256(으)로 테이블 공간 TEMP에서 임시 세그먼트를 확장할 수 없습니다.
정 과: 01:39:56.08
---------------------------------------------------------------------------------------------
| Operation | Name | Rows | Pstart | Pstop |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------
| INSERT STATEMENT | | 5248 | | | | |
| LOAD AS SELECT | | | | | P->S | |
| HASH JOIN | | 5248 | | | P->P | QC (RAND) |
| HASH JOIN OUTER | | 5248 | | | PCWP | BROADCAST |
| PARTITION HASH ALL | | | 1 | 128 | PCWP | |
| TABLE ACCESS FULL | 상품기본이력임시 | 5248 | 1 | 128 | P->P | BROADCAST |
| TABLE ACCESS FULL | 상품 | 7595K | | 80 | PCWP | |
| TABLE ACCESS FULL | 코드상세 | 26 | | 80 | P->P | BROADCAST |
| TABLE ACCESS FULL| DEPT | 상품상세 | 7772K | | 80 | PCWP | |
----------------------------=----------------------------------------------------------------
INSERT /*+ APPEND */ INTO 상품기본이력 (...)
SELECT /*+ ORDERED PARALLEL(A,16) PARALLEL(B,16) PARALLEL(C,16) PARALLEL(D,16)
PQ_DISTRIBUTE(B, NONE, PARTITION)
PQ_DISTRIBUTE(C, NONE, BROADCAST)
PQ_DISTRIBUTE(D, HASH, HASH) */
......
FROM 상품기본이력임시 A,
상품 B,
코드상세 C,
상품상세 D 7
WHERE A.상품번호 = B.상품번호 8
AND ...
/
정 과: 00:02:29.00
----------------------------------------------------------------------------------------------
| Operation | Name | Rows | Pstart | Pstop |IN-OUT| PQ Distrib |
-----------------------------=----------------------------------------------------------------
| INSERT STATEMENT | | 5248 | | | | |
| LOAD AS SELECT | | | | | | |
| HASH JOIN | | 5248 | | | P->S | QC (RAND) |
| HASH JOIN OUTER | | 5248 | | | P->P | HASH |
| HASH JOIN | | 5248 | | | PCWP | |
| PARTITION HASH ALL | | | 1 | 128 | PCWP | |
| TABLE ACCESS FULL | 상품기본이력임시 | 5248 | 1 | 128 | PCWP | |
| TABLE ACCESS FULL | 상품 | 7595K | | 80 | P->P | PART(KEY) |
| TABLE ACCESS FULL | 코드상세 | 26 | | 80 | P->P | BROADCAST |
| TABLE ACCESS FULL| DEPT | 상품상세 | 7772K | | 80 | P->P | HASH |
----------------------------=----------------------------------------------------------------