12.1 버전에 추가된 PX SEND 1 SLAVE 오퍼레이션을 살펴보자.
테스트를 위해 아래와 같에 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMER); CREATE TABLE t2 (c1 NUMBER, c2 NUMER);
아래는 쿼리에 대한 11.2 버전 실행 계획이다. ROW_NUMBER 함수로 인해 실행 계획 10번 PX SEND QC (RANDOM) 오퍼레이션에서 P->S 분배가 발생했다. 순위를 계산하기 위해 QC로 결과를 전송한 것이다.
-- 2 SELECT /*+ ORDERED FULL(B) PARALLEL(B 2) USE_HASH(B) PQ_DISTRIBUTE(B HASH HASH) */ * FROM (SELECT /*+ FULL(A) PARALLEL(A 2) */ a.* , ROW_NUMBER() OVER (ORDER BY c1) AS rn FROM t1 a) a , t2 B WHERE a.rn = 1 AND b.c1 = a.c1; ------------------------------------------------------------------------------------ | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | | | 1 | PX COORDINATOR | | | | | | 2 | PX SEND QC (RANDOM) | :TQ20002 | Q2,02 | P->S | QC (RAND) | |* 3 | HASH JOIN BUFFERED | | Q2,02 | PCWP | | | 4 | BUFFER SORT | | Q2,02 | PCWC | | | 5 | PX RECEIVE | | Q2,02 | PCWP | | | 6 | PX SEND HASH | :TQ20000 | | S->P | HASH | |* 7 | VIEW | | | | | |* 8 | WINDOW SORT PUSHED RANK | | | | | | 9 | PX COORDINATOR | | | | | | 10 | PX SEND QC (RANDOM) | :TQ10000 | Q1,00 | P->S | QC (RAND) | -- ! |* 11 | WINDOW CHILD PUSHED RANK| | Q1,00 | PCWP | | | 12 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 13 | TABLE ACCESS FULL | T1 | Q1,00 | PCWP | | | 14 | PX RECEIVE | | Q2,02 | PCWP | | | 15 | PX SEND HASH | :TQ20001 | Q2,01 | P->P | HASH | | 16 | PX BLOCK ITERATOR | | Q2,01 | PCWC | | | 17 | TABLE ACCESS FULL | T2 | Q2,01 | PCWP | | ------------------------------------------------------------------------------------
아래는 동일한 쿼리에 대한 12.1 버전 실행 계획이다. 9번 PX SEND 1 SLAVE 오레이션을 확인할 수 있다. 지난 글에서 살펴본 PX SELECTOR 오레이션과 원리가 동일하다. QC가 했던 작업을 특정 병렬 프로세스에 위임하는 방식이다.
-- 3 ----------------------------------------------------------------------------------- | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | | | 1 | PX COORDINATOR | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10003 | Q1,03 | P->S | QC (RAND) | |* 3 | HASH JOIN BUFFERED | | Q1,03 | PCWP | | | 4 | PX RECEIVE | | Q1,03 | PCWP | | | 5 | PX SEND HASH | :TQ10001 | Q1,01 | S->P | HASH | |* 6 | VIEW | | Q1,01 | SCWC | | |* 7 | WINDOW SORT PUSHED RANK | | Q1,01 | SCWP | | | 8 | PX RECEIVE | | Q1,01 | SCWP | | | 9 | PX SEND 1 SLAVE | :TQ10000 | Q1,00 | P->S | 1 SLAVE | -- ! |* 10 | WINDOW CHILD PUSHED RANK| | Q1,00 | PCWP | | | 11 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 12 | TABLE ACCESS FULL | T1 | Q1,00 | PCWP | | | 13 | PX RECEIVE | | Q1,03 | PCWP | | | 14 | PX SEND HASH | :TQ10002 | Q1,02 | P->P | HASH | | 15 | PX BLOCK ITERATOR | | Q1,02 | PCWC | | | 16 | TABLE ACCESS FULL | T2 | Q1,02 | PCWP | | -----------------------------------------------------------------------------------
'Oracle > Tuning' 카테고리의 다른 글
조건 기술에 따른 MERGE 문의 성능 차이 (0) | 2018.12.26 |
---|---|
INLIST ITERATOR 성능 개선 (0) | 2018.12.26 |
PX SELECTOR 오퍼레이션 (0) | 2018.12.19 |
PRECOMPUTE_SUBQUERY 힌트 (0) | 2018.12.14 |
DB 링크 튜닝 기법 (0) | 2018.12.13 |