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

금액을 부가세 포함으로 바꾸는 UPDATE 한 문장이 redo 1.2GB를 쓰고, DBA는 인덱스를 다 끄자고 한다

중급UPDATE한빛유통477 / 700

상황 ​

다음 달부터 정산 기준이 부가세 포함 금액으로 바뀐다. 토요일 22:00 ~ 24:00 작업 창에 T_ORD_BIG의 ORD_AMT를 모두 부가세 포함 금액(원 단위 반올림)으로 바꾸기로 했다. 운영 복제본 리허설에서 UPDATE 한 문장이 6분 52초 걸렸고 redo가 1,186MB 나왔다. DBA 의견: "인덱스 둘 다 끄고 돌린 다음 다시 짓죠." 정산팀은 작업 창 동안에도 정산 목록 화면(Q4)은 열어 두기를 바란다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · 이번 작업은 모든 행의 ORD_AMT를 바꾼다. 트리거와 FK는 없다.
  • IX_ORD_BIG_DT_AMT (ORD_DT, ORD_AMT): 리프 3,206블록 · 낮의 Q1(기간 매출, 91블록)이 쓴다.
  • IX_ORD_BIG_DT_SEQ (ORD_DT, ORD_SEQ): 리프 3,344블록 · Q4(정산 목록 페이징, 15블록)가 쓴다.
  • 운영은 ARCHIVELOG이고 테이블과 인덱스는 LOGGING이다. 온라인 리두 로그는 200MB × 3이다.

원본 SQL ​

sql
-- 토요일 22:00 작업 창 (리허설)
UPDATE T_ORD_BIG
   SET ORD_AMT = ROUND(ORD_AMT * 1.1);
COMMIT;

실행계획 학습용 예시 · 인덱스 크기와 Q1 · Q4 숫자는 교재 02화, 09화, 14화 규모 ​

xplan
------------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |           |      1 |        |      0 |00:06:52.40 |   6312K |
|   1 |  UPDATE            | T_ORD_BIG |      1 |        |      0 |00:06:52.40 |   6312K |
|   2 |   TABLE ACCESS FULL| T_ORD_BIG |      1 |   1000K|   1000K|00:00:00.31 |    5826 |
------------------------------------------------------------------------------------------

[세션 통계 — 리허설 (운영 복제본 · ARCHIVELOG)]
                                ORD_AMT 갱신 (원본)      (비교) ORD_ST를 같은 길이 값으로 갱신 · 같은 100만 행
  바뀐 칸이 든 인덱스            IX_ORD_BIG_DT_AMT          없음
  redo size                      1,186 MB                   236 MB
  undo change vector size          402 MB                    98 MB
  db block changes               4,128,460                 1,021,300
  경과                           6분 52초                   41초
  그중 log file switch 대기      5분 10초                   12초

[UPDATE 뒤 인덱스 크기 (리프 블록)]
  IX_ORD_BIG_DT_AMT  3,206 → 5,310 · IX_ORD_BIG_DT_SEQ  3,344 → 3,344

문제 ​

  1. redo 1,186MB를 테이블 몫과 인덱스 몫으로 나누고, 이 UPDATE가 어느 인덱스를 고치는지 설명하시오.
  2. 작업 창 안에 끝나고 Q4도 그대로 쓸 수 있도록 작업을 고치시오. DBA의 '인덱스 둘 다 끄기' 안도 평가하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자