Oracle/Tuning2018. 3. 3. 08:45

12.1 버전에 PQ_REPLICATE 기능이 추가되었다. BROADCAST 분배 방식의 변형으로 볼 수 있다.


테스트를 위해 아래와 같이 테이블을 생성하자.

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;

CREATE TABLE t1 (c1 NUMBER);
CREATE TABLE t2 (c1 NUMBER);


아래 쿼리는 PQ_DISTRIBUTE 힌트에 BROADCAST 분배 방식을 지정했지만, 실행 계획에 BROADCAST 오퍼레이션이 표시되지 않는다. OUTLINE을 확인해보면 PQ_REPLICATE 힌트가 사용된 것을 확인할 수 있다.

-- 2
SELECT /*+ ORDERED FULL(A) FULL(B) PARALLEL(A 8) PARALLEL(B 8) USE_HASH(B)
           PQ_DISTRIBUTE(B BROADCAST NONE) */
       *
  FROM t1 a
     , t2 b
 WHERE b.c1 = a.c1;

-----------------------------------------------------------------------
| Id  | Operation             | Name     |    TQ  |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |        |      |            |
|   1 |  PX COORDINATOR       |          |        |      |            |
|   2 |   PX SEND QC (RANDOM) | :TQ10000 |  Q1,00 | P->S | QC (RAND)  |
|*  3 |    HASH JOIN          |          |  Q1,00 | PCWP |            |
|   4 |     TABLE ACCESS FULL | T1       |  Q1,00 | PCWP |            |
|   5 |     PX BLOCK ITERATOR |          |  Q1,00 | PCWC |            |
|   6 |      TABLE ACCESS FULL| T2       |  Q1,00 | PCWP |            |
-----------------------------------------------------------------------

Outline Data
-------------
      PQ_REPLICATE(@"SEL$1" "B"@"SEL$1")
      PQ_DISTRIBUTE(@"SEL$1" "B"@"SEL$1" BROADCAST NONE)


BROADCAST 분배 방식은 병렬 서버에서 테이블을 나눠서 읽은 후 다른 병렬 서버로 데이터를 분배하는 방식이다. 테이블을 8GB로 가정하면 DOP가 8인 경우, 각각의 병렬 서버가 1GB씩 읽은 후 8개의 서버로 1GB씩 분배하므로 I/O는 8GB(1GB*8), 분배량은 64GB(1GB*8*8)다. DOP가 16인 경우에는 I/O는 동일하게 8GB(0.5GB*16)지만, 분배량은 128GB(0.5GB*16*16)로 증가한다. DOP가 커질수록 전송량이 배수적으로 증가하는 구조다.


이런 현상을 해결하기 위해 추가된 기능이 PQ_REPLICATE 방식이다. PQ_REPLICATE 방식은 각각의 병렬 서버에서 전체 테이블을 읽기 때문에 데이터 분배가 발생하지 않는다. DOP가 8, 16인 경우 각각 64GB(8GB*8), 128GB(8GB*16)의 I/O가 발생한다. BROADCAST 분배 시 DOP가 높고 테이블 크기가 작은 경우 분배량 감소를 통한 성능을 개선할 수 있다.


반대로 잘못된 통계 정보로 인해 크기가 큰 테이블이 PQ_REPLICATE 방식으로 동작할 경우 과도한 I/O로 인해 성능이 저하될 수 있다.[각주:1] NO_PQ_REPLICATE 힌트를 사용하면 해당 기능의 동작을 제어할 수 있다.

-- 3
SELECT /*+ ORDERED FULL(A) FULL(B) PARALLEL(A 8) PARALLEL(B 8) USE_HASH(B)
           PQ_DISTRIBUTE(B BROADCAST NONE)
           NO_PQ_REPLICATE(B) */
       *
  FROM t1 a
     , t2 b
 WHERE b.c1 = a.c1;

-------------------------------------------------------------------------
| Id  | Operation               | Name     |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |          |        |      |            |
|   1 |  PX COORDINATOR         |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)   | :TQ10001 |  Q1,01 | P->S | QC (RAND)  |
|*  3 |    HASH JOIN            |          |  Q1,01 | PCWP |            |
|   4 |     PX RECEIVE          |          |  Q1,01 | PCWP |            |
|   5 |      PX SEND BROADCAST  | :TQ10000 |  Q1,00 | P->P | BROADCAST  |
|   6 |       PX BLOCK ITERATOR |          |  Q1,00 | PCWC |            |
|   7 |        TABLE ACCESS FULL| T1       |  Q1,00 | PCWP |            |
|   8 |     PX BLOCK ITERATOR   |          |  Q1,01 | PCWC |            |
|   9 |      TABLE ACCESS FULL  | T2       |  Q1,01 | PCWP |            |
-------------------------------------------------------------------------


  1. read by other session 이벤트 발생한다. [본문으로]
Posted by 정희락_