테마
12화 장애 뒤 DBA가 「FK 컬럼에는 모두 인덱스를 만든다」는 표준을 세우고, 한빛유통 스키마의 FK 다섯 개에 인덱스를 만드는 스크립트를 올렸다. 야간 체인 담당 오과장이 반대했다. "주문상세는 보관 배치와 이관 리허설 때마다 20만 행씩 넣어요. 인덱스가 하나 늘 때마다 그만큼 느려져요." 박팀장이 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로 찾는 화면은 없다(상품별 판매는 밤에 전체를 읽어 집계한다).-- 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);
[개인정보 파기 배치 — 고객 한 명 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 초