Skip to content
튜닝 연습파티션
PART-031

판매상품 재집계를 칸마다 하나씩 여섯 작업으로 나눴는데 두 작업만 두 배 늦게 끝난다

기초DDL유통406 / 700

상황 ​

매월 1일 「판매상품 재집계」 배치는 CF11_H를 칸마다 작업 하나씩 맡겨 여섯 작업으로 나눠 돌린다. 작업마다 읽은 행을 상품 단가 이력과 맞춰 보는 PL/SQL 처리가 이어서 돌아서, 작업 시간은 읽은 행 수에 거의 비례한다. 지난달 작업 1, 2, 5, 6은 약 6분 10초에 끝났고 작업 3과 4는 약 12분 30초가 걸렸다. 배치는 가장 늦은 작업이 끝나야 끝난다. 2019년 설계 메모에는 "작업 슬롯 6개 → 해시 6칸."이라고 적혀 있고, 올해 배치 서버의 동시 작업 한도는 8로 늘었다.

테이블과 인덱스 ​

  • CF11_H 판매상품(파티션 복사본, 문제 설정): CF11 1,096,708행 · 8,204블록을 PARTITION BY HASH (SLE_NO) PARTITIONS 6으로 나눠 CTAS로 지었다. SLE_NO는 판매번호로 값이 약 50만 가지다.
  • LOCAL 인덱스 CF11_H_PK (SLE_NO, ITM_NO). 다른 인덱스는 없다. 통계는 최신이다.
  • 작업 하나는 칸 하나를 PARTITION (칸 이름)으로 지목해 읽고 상품별로 합쳐 작업 테이블 CF11_SUM_W에 넣는다.

원본 SQL ​

sql
CREATE TABLE CF11_H
PARTITION BY HASH (SLE_NO) PARTITIONS 6
AS SELECT * FROM CF11;

-- 작업 k (k = 1 ~ 6) : 칸 하나를 맡는다 (아래는 작업 3)
INSERT INTO CF11_SUM_W (JOB_NO, ITM_NO, SLE_QTY, SLE_AMT)
SELECT :job_no, ITM_NO, SUM(SLE_QTY), SUM(SLE_QTY * SLE_UPRC)
  FROM CF11_H PARTITION (SYS_P3103)
 GROUP BY ITM_NO;

실행계획 학습용 예시 ​

xplan
[작업 1 · SYS_P3101]
-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name       | Starts | E-Rows | A-Rows |      A-Time | Buffers | Pstart | Pstop |
-------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |            |      1 |        |      0 | 00:00:00.21 |    1031 |        |       |
|   1 |  LOAD TABLE CONVENTIONAL | CF11_SUM_W |      1 |        |      0 | 00:00:00.21 |    1031 |        |       |
|   2 |   HASH GROUP BY          |            |      1 |    109 |    109 | 00:00:00.20 |    1026 |        |       |
|   3 |    PARTITION HASH SINGLE |            |      1 |   137K |   137K | 00:00:00.09 |    1026 |      1 |     1 |
|   4 |     TABLE ACCESS FULL    | CF11_H     |      1 |   137K |   137K | 00:00:00.07 |    1026 |      1 |     1 |
-------------------------------------------------------------------------------------------------------------------

[작업 3 · SYS_P3103]
-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name       | Starts | E-Rows | A-Rows |      A-Time | Buffers | Pstart | Pstop |
-------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |            |      1 |        |      0 | 00:00:00.42 |    2056 |        |       |
|   1 |  LOAD TABLE CONVENTIONAL | CF11_SUM_W |      1 |        |      0 | 00:00:00.42 |    2056 |        |       |
|   2 |   HASH GROUP BY          |            |      1 |    109 |    109 | 00:00:00.40 |    2051 |        |       |
|   3 |    PARTITION HASH SINGLE |            |      1 |   274K |   274K | 00:00:00.18 |    2051 |      3 |     3 |
|   4 |     TABLE ACCESS FULL    | CF11_H     |      1 |   274K |   274K | 00:00:00.14 |    2051 |      3 |     3 |
-------------------------------------------------------------------------------------------------------------------

[USER_TAB_PARTITIONS]
  PARTITION_NAME  POSITION   NUM_ROWS   BLOCKS
  SYS_P3101              1    137,092    1,026
  SYS_P3102              2    137,071    1,025
  SYS_P3103              3    274,180    2,051
  SYS_P3104              4    274,203    2,051
  SYS_P3105              5    137,085    1,026
  SYS_P3106              6    137,077    1,025

문제 ​

  1. 3번과 4번 칸만 다른 칸의 두 배인 까닭을 해시 파티션의 칸 수로 설명하시오.
  2. 테이블을 새로 짓지 않고 칸을 고르게 만드는 DDL을 쓰고, 그 DDL이 하는 일과 돌리기 전후에 확인할 것을 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자