Oracle/Tuning2018. 12. 21. 11:02

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
Posted by 정희락_