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

지난달 교훈대로 ONLINE을 붙인 인덱스 생성이 38분째 끝나지 않는다

중급DDL유통539 / 700

상황 ​

본사 레거시 유통은 지난달 10:30에 CF11에 인덱스를 만들다가 47초 동안 매장 POS의 판매 저장을 세웠다. 포스트모템의 재발방지 1번은 "영업시간의 인덱스 생성에는 ONLINE을 붙인다"였다. 이번 달에는 MD팀의 상품별 판매 조회용 인덱스를 같은 시간대에 ONLINE으로 만들었다. 매장 POS는 아무 문제가 없다. 그런데 리허설(같은 크기의 사본)에서 52초 걸린 생성이 11:08인 지금 38분째 끝나지 않는다. MD팀은 12:00 보고 전에 조회가 빨라지기를 기다리고 있다.

테이블과 인덱스 ​

  • CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO)(ITM_NO만으로 찾으면 선두 컬럼이 아니다) · 영업 중에는 POS가 판매를 INSERT하고 반품과 수량 정정을 UPDATE한다
  • 만드는 인덱스: CF11_X01 (ITM_NO, SLE_NO) · 운영 DB는 EE다
  • 지난달 ONLINE 없이 만든 47초 동안 POS의 판매 저장은 enq: TM - contention으로 기다렸다(그때의 V$LOCK에서 DDL은 CF11에 TM 4)
  • 본사 전산 담당자들은 SQL Developer를 자동 커밋을 끈 채 쓴다

원본 SQL ​

sql
-- 10:30 · 재발방지 1번대로
CREATE INDEX CF11_X01 ON CF11 (ITM_NO, SLE_NO) ONLINE;

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

xplan
[V$SESSION — 11:08:20]
SID   SERIAL#  PROGRAM          STATUS     EVENT                            SECS    BLOCKING_SESSION   하고 있는 문장 / 마지막 문장
152   8811     sqlplus (DBA)    ACTIVE     enq: TX - row lock contention    2,292   88                 CREATE INDEX CF11_X01 ON CF11 (ITM_NO, SLE_NO) ONLINE
88    4127     SQL Developer    INACTIVE   SQL*Net message from client      2,381                      (마지막) UPDATE CF11 SET SLE_QTY = 3 WHERE SLE_NO = '20231208-0217' AND ITM_NO = '1000044'
(POS 세션 41개 · 기다리는 세션 없음 · 판매 저장 평균 0.02초)

[V$LOCK — 같은 시각]
SID   TYPE  대상 / 이름표         LMODE  REQUEST  BLOCK
152   TM    CF11                    2       0       0
152   TX    88 의 트랜잭션           0       4       0
88    TM    CF11                    3       0       0
88    TX    88 의 트랜잭션           6       0       1
(POS 세션들: TM CF11 3 · 각자의 TX 6 — 누구도 152 에게 막히지 않는다)

[V$TRANSACTION — SID 88]
START_TIME           USED_UBLK   USED_UREC
12/08/23 10:28:39        1           1        ← 10:28 에 한 행을 고치고 COMMIT 하지 않았다

[지난달 · ONLINE 없이 같은 크기의 인덱스]
10:30:02 ~ 10:30:49   DDL 이 CF11 에 TM 4 · POS 판매 저장 enq: TM - contention (최대 46초)

문제 ​

  1. V$SESSION과 V$LOCK을 근거로 인덱스 생성이 무엇을 기다리는지, 그런데도 POS가 멀쩡한 이유를 설명하시오. 지난달의 ONLINE 없는 생성과 락이 어떻게 다른지도 쓰시오.
  2. 지금 할 일을 SQL로 쓰고, 하면 안 되는 일과 그 이유를 쓰시오.
  3. 다음 인덱스 생성 전에 확인할 것을 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자