행위

PQ REPLICATE 힌트

DB CAFE

Dbcafe (토론 | 기여)님의 2022년 9월 8일 (목) 15:39 판 (새 문서: PQ_REPLICATE 힌트 정희락_ 2018. 3. 3. 08:45 12.1 버전에 PQ_REPLICATE 기능이 추가되었다. BROADCAST 분배 방식의 변형으로 볼 수 있다. 테스트를 위해...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
thumb_up 추천메뉴 바로가기


PQ_REPLICATE 힌트 정희락_ 2018. 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 | |


닫기