테마
본사 레거시 유통 전산 담당자가 다음 주 토요일 14:00에 돌릴 변경 작업 계획서를 보내왔다. 매장 여섯 곳은 그 시간에 영업 중이고, 토요일 오후는 판매가 가장 많은 때다. 새벽 작업은 외주 DBA 일정이 맞지 않아 두 달 뒤에나 된다고 한다. 담당자의 메모는 이렇다. "다섯 줄 다 개발 DB에서 1초 안에 끝났습니다. 영업 중이어도 괜찮겠죠?"
CF10 판매: 500,000행 · 4,583블록 · CF10_PK (SLE_NO) · SHP_NO는 지금 VARCHAR2(5) · POS가 판매마다 INSERT한다CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO)(리프 7,850블록) · POS가 판매마다 1 ~ 3행 INSERT하고, 반품이면 UPDATE한다CF15 입출고상품: 51,497행 · 349블록 · PK CF15_PK (INOUT_NO, ITM_NO) · 물류센터 화면이 입출고마다 INSERT한다 · 지난달 2년 전 입출고 3만 행을 지워 블록 절반이 비었다CF11에는 SLE_NO가 CF10에 없는 행이 하나도 없다(지난주 확인)DDL_LOCK_TIMEOUT 기본값 0-- 변경 작업 계획서 · 토요일 14:00 · 위에서부터 차례로
-- ① 매장 번호 체계 확장 대비 — 칸 넓히기
ALTER TABLE CF10 MODIFY (SHP_NO VARCHAR2(10));
-- ② MD 「매장별 일 매출」 화면용 인덱스
CREATE INDEX CF10_X01 ON CF10 (SHP_NO, SLE_DT);
-- ③ 판매상품 → 판매 FK (감사 지적)
ALTER TABLE CF11 ADD CONSTRAINT CF11_FK_SLE FOREIGN KEY (SLE_NO) REFERENCES CF10 (SLE_NO);
-- ④ 지난달 지운 입출고 공간 회수
ALTER TABLE CF15 MOVE;
-- ⑤ 정기 인덱스 리빌드 (분기마다)
ALTER INDEX CF11_PK REBUILD;
[개발 DB 리허설 — 운영의 1/50 크기 · 아무도 쓰지 않는 DB]
① 0.02초 ② 0.14초 ③ 0.31초 ④ 0.02초 ⑤ 0.19초
[운영 크기로 만든 사본에서 혼자 다시 잼 (학습용 예시)]
줄 걸린 시간 그동안 쥐는 락 그동안 같은 테이블의 DML 끝난 뒤
① 0.02초 CF10 TM 6 (잠깐) 잠깐 기다림 CF10 을 쓰는 커서가 모두 무효
② 6.8초 CF10 TM 4 POS 판매 INSERT 기다림 —
③ 14.2초 CF11 에 DML 을 막는 락 (검증 내내) POS 판매상품 INSERT · 반품 기다림 —
④ 0.6초 CF15 TM 6 입출고 INSERT 기다림 CF15_PK UNUSABLE → 입출고 INSERT ORA-01502
⑤ 9.5초 CF11 TM 4 POS 판매상품 INSERT 기다림 CF11_PK 리프 7,850 → 7,790 (0.8% 줄었다)
[운영 · 지난주 토요일 14:00 ~ 15:00 에 1분마다 찍은 V$LOCKED_OBJECT]
CF10 · CF11 에 열린 트랜잭션은 늘 2 ~ 5개 · 하나가 1 ~ 3초 (카드 승인을 기다린다)