Skip to content
튜닝 연습DML과 배치 튜닝
DML-020

고객번호를 가명으로 바꾸는 UPDATE 한 문장에 2분 47초가 걸리고, 그 뒤로 분석 업체의 기간 조회가 1.5배 블록을 읽는다

기초DDL한빛유통445 / 700

상황 ​

한빛유통은 외부 분석 업체에 주문 데이터를 넘기기 전에, 분석 DB 사본 T_ORD_BIG의 고객번호를 가명(해시값)으로 바꾸기로 했다. 개발자가 칸 길이를 늘리고 UPDATE 한 문장으로 바꾸는 스크립트를 리허설했더니 2분 47초가 걸리고 redo가 약 598MB 나왔다. 끝난 뒤에는 분석 업체가 쓸 기간 조회가 전보다 1.5배 많은 블록을 읽었다. 오과장: "값만 바꿨고 행 수는 그대로인데 조회는 왜 느려지죠?"

테이블과 인덱스 ​

  • T_ORD_BIG(분석 DB 사본): 1,000,000행 · 5,826블록(블록당 약 172행, 행 평균 약 43바이트) · PCTFREE 10 · CUS_ID VARCHAR2(40) 'CUS_000123'(10자)
  • 가명 고객번호는 RAWTOHEX(STANDARD_HASH(…, 'SHA256'))로 만든 64자다. 행마다 54바이트씩 길어진다.
  • 인덱스는 IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT) 하나다. 분석 업체 계정 ANL_VENDOR에 SELECT 권한이 있고, 통계는 최신이다(ORD_ST에 히스토그램). 트리거와 FK는 없다.
  • 분석 DB는 NOARCHIVELOG다. 매달 1일 운영에서 새로 받고, 업체에 넘기기 전까지는 아무도 쓰지 않는다.

원본 SQL ​

sql
-- 분석 DB · 업체 전달 전 가명 처리 (리허설)
ALTER TABLE T_ORD_BIG MODIFY (CUS_ID VARCHAR2(64));

UPDATE T_ORD_BIG
   SET CUS_ID = RAWTOHEX(STANDARD_HASH('HBANL' || CUS_ID, 'SHA256'));
COMMIT;

실행계획 학습용 예시 ​

xplan
------------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |           |      1 |        |      0 |00:02:47.10 |   3108K |
|   1 |  UPDATE            | T_ORD_BIG |      1 |        |      0 |00:02:47.10 |   3108K |
|   2 |   TABLE ACCESS FULL| T_ORD_BIG |      1 |   1000K|   1000K|00:00:00.43 |    5826 |
------------------------------------------------------------------------------------------

[세션 통계 — UPDATE 한 번]
  redo size                    약 598 MB
  undo change vector size      약 141 MB
  db block changes             약 3,060,000

[UPDATE 뒤 — ANALYZE TABLE T_ORD_BIG LIST CHAINED ROWS]
  블록 5,826 → 12,630 · CHAINED_ROWS 517,300행 (52%)
  업체의 기간 조회 (2024년 6월 · IX_ORD_BIG_DT_AMT → 테이블)
    Buffers 27,481 → 41,720 · table fetch continued row 14,239

문제 ​

  1. 값만 바꿨는데 redo와 undo가 이만큼 생기고, 기간 조회까지 블록을 더 읽게 된 이유를 설명하시오.
  2. UPDATE 대신 가명 고객번호를 담은 새 테이블을 만들어 바꿔 끼우도록 다시 작성하고, 바꿔 끼울 때 다시 챙겨야 하는 것을 쓰시오.
  3. 같은 테이블이라도 UPDATE가 맞는 경우는 언제인지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자