Skip to content
튜닝 연습Lock과 동시성 제어
LOCK-049

토요일 오후 영업 중에 돌리겠다는 변경 작업 계획서 다섯 줄을 검토해 달라고 한다

실전DDL유통544 / 700

상황 ​

본사 레거시 유통 전산 담당자가 다음 주 토요일 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에 없는 행이 하나도 없다(지난주 확인)
  • 토요일 오후 판매는 매장 여섯 곳을 합쳐 분당 40건 안팎이다 · 운영 DB는 19c EE · DDL_LOCK_TIMEOUT 기본값 0

원본 SQL ​

sql
-- 변경 작업 계획서 · 토요일 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;

실행계획 학습용 예시 · ONLINE 없는 CREATE INDEX의 TM 4는 교재 12화 실측(실습/05 [D4]) ​

xplan
[개발 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초 (카드 승인을 기다린다)

문제 ​

  1. 다섯 줄마다 영업 중에 돌리면 무엇을 잠그고 매장이 무엇을 겪는지, 개발 DB 리허설이 그것을 왜 보여 주지 못했는지 설명하시오.
  2. 토요일 14:00에 돌려도 되도록 계획서를 다시 쓰시오. 뺄 줄은 빼고 이유를 쓰시오.
  3. 고친 계획서에도 남는 위험과 작업 중에 지켜볼 것을 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자