포스트

Group By Push Down

Parallel Query 에서 GROUP BY 를 슬레이브 단에서 미리 수행해 Table Queue 로 전달되는 데이터 건수를 줄이는 변환입니다. GBY_PUSHDOWN 힌트로 선 GROUP BY → 후 GROUP BY 두 단계로 분리되어 일량이 감소합니다.

Group By Push Down

Parallel Query 에서 슬레이브 단의 선 GROUP BY 로 데이터를 줄인 뒤 Table Queue 로 전달해 일량을 감소시키는 변환입니다.

핵심 정리

  1. Group By Push Down 이란 GROUP BY 를 미리 수행하여 데이터 건수를 대폭 줄인 후에 Table Queue 에 데이터를 전달함으로써 일량을 줄이는 목적입니다.
  2. Group By Push Down 은 Parallel Query 에 GROUP BY 가 포함되어 있는 경우 발생합니다.
  3. 선 GROUP BY 를 했을 때 확실히 줄어드는 경우에 적용해야 합니다.
  4. Disk 에서 Sorting 이나 Hash 작업이 발생하는 경우 PGA 튜닝도 함께 해야 합니다.

원본 쿼리

1
2
3
4
SELECT /*+ FULL(a) PARALLEL(a 4) GBY_PUSHDOWN */
       a.prod_id, count(*) cnt
  FROM sales a
 GROUP BY a.prod_id;

원본 쿼리 플랜

1
2
3
4
5
6
7
8
9
10
11
12
13
----------------------------------------------------------------------
| Id | Operation                | Name     |   Rows |   Bytes | Cost |
----------------------------------------------------------------------
|  0 | SELECT STATEMENT         |          |        |         |  379 |
|  1 |  PX COORDINATOR          |          |        |         |      |
|  2 |   PX SEND QC (RANDOM)    | :TQ10001 |     72 |     288 |  379 |
|  3 |    HASH GROUP BY         |          |     72 |     288 |  379 |  ← 원래 GROUP BY 가 일어나야 할 플랜에서 GROUP BY 가 일어납니다.
|  4 |     PX RECEIVE           |          |     72 |     288 |  379 |
|  5 |      PX SEND HASH        | :TQ10000 |     72 |     288 |  379 |  ← 6번에서 TQ10000 에게 데이터를 전달하기 전에 데이터를 먼저 줄여서 받습니다.
|  6 |       HASH GROUP BY      |          |     72 |     288 |  379 |  ← 3번에서 GROUP BY 가 일어나기 전 먼저 GROUP BY 가 수행됩니다.
|  7 |        PX BLOCK ITERATOR |          |   897K |   3589K |  369 |
|  8 |         TABLE ACCESS FULL| SALES    |   897K |   3589K |  369 |
----------------------------------------------------------------------

슬레이브 단의 선 GROUP BY (Id 6) 로 897K 건이 72 건으로 줄어든 뒤 Table Queue 로 전달되고, 코디네이터 단의 후 GROUP BY (Id 3) 가 최종 집계를 수행하는 두 단계 구조입니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.