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

장애 뒤 FK 컬럼마다 인덱스를 만들자는 스크립트에 야간 배치 담당이 반대한다

중급DDL한빛유통478 / 700

상황 ​

12화 장애 뒤 DBA가 「FK 컬럼에는 모두 인덱스를 만든다」는 표준을 세우고, 한빛유통 스키마의 FK 다섯 개에 인덱스를 만드는 스크립트를 올렸다. 야간 체인 담당 오과장이 반대했다. "주문상세는 보관 배치와 이관 리허설 때마다 20만 행씩 넣어요. 인덱스가 하나 늘 때마다 그만큼 느려져요." 박팀장이 FK마다 근거를 붙여 정리해 달라고 했다.

테이블과 인덱스 ​

  • FK 다섯(자식 칸 → 부모)과 자식에 이미 있는 인덱스
    • FK_T_ORD_DET_ORD: T_ORD_DET (ORD_SEQ) → T_ORD · 자식에 PK_T_ORD_DET (ORD_SEQ, ORD_DET_NO)
    • FK_T_ORD_DET_ITM: T_ORD_DET (ITM_ID) → M_ITM · 해당 인덱스 없음
    • FK_T_ORD_CUS: T_ORD (CUS_ID) → M_CUS · 자식에 IX_T_ORD_CUS_DT (CUS_ID, ORD_DT)(고객별 주문 화면용)
    • FK_T_ITM_EVL_ITM: T_ITM_EVL (ITM_ID) → M_ITM · 자식에 PK_T_ITM_EVL (ITM_ID, EVL_LST_NO)
    • FK_T_ITM_EVL_CUS: T_ITM_EVL (CUS_ID) → M_CUS · 해당 인덱스 없음
  • 부모를 고치는 일: M_CUS는 매주 개인정보 파기 배치가 탈퇴 고객 3 ~ 5명을 지운다. M_ITM은 지우지 않고 단종이면 ITM_TP만 바꾼다. T_ORD는 매년 보관 배치가 지난해 주문을 지운다. 어느 부모도 PK 값을 고치지 않는다.
  • T_ORD_DET 200,000행 · 896블록. T_ITM_EVL 5,000행 · 48블록. 주문상세를 ITM_ID로 찾는 화면은 없다(상품별 판매는 밤에 전체를 읽어 집계한다).

원본 SQL ​

sql
-- FK 인덱스 표준 적용 (DBA · 12화 후속)
CREATE INDEX IX_T_ORD_DET_ORD ON T_ORD_DET (ORD_SEQ);
CREATE INDEX IX_T_ORD_DET_ITM ON T_ORD_DET (ITM_ID);
CREATE INDEX IX_T_ORD_CUS     ON T_ORD (CUS_ID);
CREATE INDEX IX_T_ITM_EVL_ITM ON T_ITM_EVL (ITM_ID);
CREATE INDEX IX_T_ITM_EVL_CUS ON T_ITM_EVL (CUS_ID);

실행계획 학습용 예시 · 인덱스 하나당 적재 비용은 교재 14화 5만 행 표와 같은 비율 ​

xplan
[개인정보 파기 배치 — 고객 한 명 DELETE FROM M_CUS (지난주)]
  자식 테이블    자식에서 FK를 확인한 방법                          잠금
  T_ORD          INDEX RANGE SCAN IX_T_ORD_CUS_DT · 3블록          없음
  T_ITM_EVL      TABLE ACCESS FULL · 48블록                       확인하는 동안 T_ITM_EVL에 TM 4(SHARE)
  지난주 파기 4명 동안 상품평 등록 화면   enq: TM - contention 3건 (최대 1.2초)

[T_ORD_DET 20만 행 적재 리허설 — 인덱스 개수별 (연습 DB)]
  인덱스                          redo        db block changes    경과
  PK만 (지금)                     52.1 MB         41만             3.9 초
  + (ORD_SEQ)                    100.4 MB         81만             7.6 초
  + (ORD_SEQ) + (ITM_ID)         148.9 MB        121만            11.8 초

문제 ​

  1. 다섯 FK 각각에 대해 인덱스가 필요한지 판단하고 근거를 쓰시오.
  2. 판단대로 스크립트를 고치시오.
  3. 오과장이 걱정한 적재 비용을 위 숫자로 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자