테마
유통 본사는 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를 더해도 된다.-- 지금 배치 (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;
[지금 배치 — 세션 통계]
경과 시간 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)