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

시퀀스로 바꾼 뒤 정산번호가 군데군데 빈다

중급DDL한빛유통506 / 700

상황 ​

12화의 장애 뒤에 정산번호를 시퀀스 SQ_STLM_SEQ(CACHE 20)로 바꾼 지 한 달이 지났다. 정산팀 조민우 씨가 빈 번호 목록을 들고 왔다. "6월 첫 주에만 45개가 비었어요. 3일 새벽에는 13개가 한꺼번에요. 데이터가 지워진 건 아니죠?" 개발팀은 아래 DDL을 다음 배포에 넣겠다고 한다. 정산번호의 업무 규정은 12화에서 정한 그대로다. 겹치면 안 되고, 결번은 사유를 기록하면 된다.

테이블과 인덱스 ​

  • T_ORD_STLM 정산: 100,000행 · 640블록(5월 말 기준) · PK_T_ORD_STLM (STLM_SEQ) · 6월 1일 ~ 4일에 6,214건이 더 들어왔다
  • 시퀀스 SQ_STLM_SEQ: CACHE 20 · NOORDER · 데이터베이스는 단일 인스턴스
  • 정산 등록은 화면(낮)과 보정 배치(밤)가 한다. 화면은 카드사 응답을 받은 뒤 COMMIT하고, 보정 배치는 30건을 등록한 뒤 COMMIT한다
  • 앱 로그, 배치 로그, DBA 작업 대장이 남아 있다 · 결번을 기록하는 곳은 아직 없다

원본 SQL ​

sql
-- 개발팀 제안 (6/5) — "번호가 비지 않게"
ALTER SEQUENCE SQ_STLM_SEQ NOCACHE ORDER;

실행계획 학습용 예시 ​

xplan
[정산팀이 찾은 빈 번호 — 6월 1일 ~ 4일]
빈 구간               개수   같은 시각의 기록
100412                  1    6/1 10:31 앱 로그 · 정산 등록 화면 · 카드사 응답 시간 초과 → ROLLBACK
100860 ~ 100889        30    6/2 23:40 배치 로그 · 보정 배치 · 30건째에서 ORA-01400 → 통째로 ROLLBACK
101377 ~ 101389        13    6/3 02:10 DBA 작업 대장 · ALTER SYSTEM FLUSH SHARED_POOL (파싱 장애 조치)
101902                  1    6/4 15:02 앱 로그 · 정산 등록 화면 · 사용자가 저장 중 취소 → ROLLBACK
합계                   45

[DBA_SEQUENCES — 6/5 09:00]
SEQUENCE_NAME   CACHE_SIZE   ORDER_FLAG   LAST_NUMBER
SQ_STLM_SEQ             20   N                102,341

[정산 등록 — 6/1 ~ 6/4]
  화면과 배치를 합쳐 초당 최대 4건 · 번호 하나 받기 Buffers 0 (20번에 한 번 SEQ$ 갱신)

문제 ​

  1. 빈 구간 넷이 각각 왜 생겼는지 기록과 시퀀스 정의로 설명하시오. 데이터가 지워진 것인지도 판단하시오.
  2. 개발팀의 DDL을 넣으면 45개 가운데 몇 개가 사라지는지와 그 대가를 쓰시오. 그 DDL 대신 무엇을 할지 SQL로 작성하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자