Skip to content
튜닝 연습DML과 배치 튜닝
DML-015

취소 정리를 세 문장으로 바꿨더니 처리됨인데 판매가 남은 건이 생겼다

중급DELETE유통440 / 700

상황 ​

유통 본사는 DW 이관 전에 2년 치 취소 판매를 운영 테이블에서 지우기로 했다. 지금 배치는 취소 접수를 한 건씩 돌면서 판매상품과 판매를 지우고 접수를 '처리됨'으로 바꾼 뒤 건마다 커밋한다(14,812건에 6.1초, 커밋 14,812번). 개발자가 세 문장과 커밋 한 번으로 바꿔 리허설했더니 0.9초로 줄었다. 그런데 대조해 보니 3건이 어긋났다. 리허설 중에도 콜센터를 흉내 낸 부하가 취소 접수를 계속 넣었다(콜센터는 24시간 접수한다).

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록 · CF10_PK (SLE_NO)
  • CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO). CF11과 CF10 사이에 FK 제약은 걸려 있지 않다(레거시).
  • CF10_CNCL 취소 접수(이 문제용 테이블): 15,236행 · 52블록 · PK SLE_NO · RCV_DT · PROC_YN('N' 미처리 · 'Y' 처리됨) · PROC_DT. 미처리 14,812건이고 그 판매상품은 32,450행이다. 회차 번호 칸 BAT_ID를 더해도 된다.
  • 보조 인덱스는 없다.

원본 SQL ​

sql
-- 지금 배치 (6.1초 · 커밋 14,812번)
BEGIN
  FOR r IN (SELECT SLE_NO FROM CF10_CNCL WHERE PROC_YN = 'N') LOOP
    DELETE FROM CF11 WHERE SLE_NO = r.SLE_NO;
    DELETE FROM CF10 WHERE SLE_NO = r.SLE_NO;
    UPDATE CF10_CNCL SET PROC_YN = 'Y', PROC_DT = SYSDATE WHERE SLE_NO = r.SLE_NO;
    COMMIT;
  END LOOP;
END;

-- 개발자가 바꾼 판 (0.9초 · 대조 불일치 3건)
DELETE FROM CF11 WHERE SLE_NO IN (SELECT SLE_NO FROM CF10_CNCL WHERE PROC_YN = 'N');
DELETE FROM CF10 WHERE SLE_NO IN (SELECT SLE_NO FROM CF10_CNCL WHERE PROC_YN = 'N');
UPDATE CF10_CNCL SET PROC_YN = 'Y', PROC_DT = SYSDATE WHERE PROC_YN = 'N';
COMMIT;

실행계획 학습용 예시 ​

xplan
[지금 배치 — 세션 통계]
  경과 시간                 6.0 ~ 6.3 초
  recursive calls           약 59,400
  execute count             약 44,450   (DELETE 29,624 · UPDATE 14,812)
  user commits              14,812
  session logical reads     약 412,000
  redo size                 약 24.1 MB

[바꾼 판 — 세션 통계]
  경과 0.9초 · execute count 4 · user commits 1 · redo 약 17.6 MB

[리허설 뒤 대조 — 원장 기준]
  CF10_CNCL 이 'Y' 인데 CF10 에 판매가 그대로 남은 접수        2건
  CF10 은 지워졌는데 CF11 에 판매상품이 남은 접수              1건
  (셋 다 리허설 중에 콜센터 흉내 부하가 넣은 접수 · 21:04:11 ~ 21:04:12)

문제 ​

  1. 바꾼 판에서 3건이 어긋난 이유를 설명하시오.
  2. 지금 배치의 비용이 어디서 나오는지 설명하시오.
  3. 정리하는 동안에도 접수가 들어온다는 점을 고려해, 빠르면서도 어긋나지 않게 다시 작성하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자