테마
12화의 장애 뒤에 한빛유통 개발팀은 채번 테이블을 그대로 두고, 번호 받기만 자율 트랜잭션 함수 FN_NEXT_NO로 떼어 냈다. 정산 등록 화면은 더 이상 10분씩 기다리지 않는다.
그런데 분기마다 지난 분기 주문 10만 건을 정산으로 다시 적재하는 보정 적재도 이 함수를 쓰도록 바꾸자, 적재가 0.3초에서 61초로 늘었다. 적재가 도는 동안에는 새벽 정산 보정 화면의 번호 받기도 들쭉날쭉 느려진다.
박팀장의 주문이다. "고치는 방법을 둘 이상 비교해서 고르고, 정산번호 규칙과 함께 대가를 적어 와라."
T_ORD 주문: 100,000행 · 896블록 · 적재 원천(전부 옮긴다) · 적재는 주문이 들어오지 않는 새벽에 돈다T_ORD_STLM 정산: 적재 대상 · PK_T_ORD_STLM (STLM_SEQ)T_STLM_NUM 채번: NUM_TP = 'STLM' 행 하나 · 지금 LAST_NO 412,000FN_NEXT_NO('STLM')를 부른다-- 12화 뒤에 만든 채번 함수 — 부른 쪽의 트랜잭션과 따로 COMMIT 한다
CREATE OR REPLACE FUNCTION FN_NEXT_NO(p_tp VARCHAR2) RETURN NUMBER IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_no NUMBER;
BEGIN
SELECT LAST_NO + 1 INTO v_no FROM T_STLM_NUM WHERE NUM_TP = p_tp FOR UPDATE;
UPDATE T_STLM_NUM SET LAST_NO = v_no WHERE NUM_TP = p_tp;
COMMIT;
RETURN v_no;
END;
-- 정산 보정 적재 — 행마다 번호
INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT)
SELECT FN_NEXT_NO('STLM'), ORD_SEQ, CUS_ID, ORD_DT, ORD_AMT
FROM T_ORD;
COMMIT;
[적재 INSERT — ALLSTATS LAST]
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | | 0 |00:01:01.20 | 211K |
| 1 | LOAD TABLE CONVENTIONAL | T_ORD_STLM | 1 | | 0 |00:01:01.20 | 211K |
| 2 | TABLE ACCESS FULL | T_ORD | 1 | 100K | 100K |00:00:00.04 | 896 |
------------------------------------------------------------------------------------------------
[TKPROF — 적재 한 번에 함께 돈 재귀 SQL (FN_NEXT_NO 안)]
SQL Execute Rows current
SELECT LAST_NO + 1 FROM T_STLM_NUM WHERE … FOR UPDATE 100,000 100,000 100,000
UPDATE T_STLM_NUM SET LAST_NO = :B2 WHERE … 100,000 100,000 100,000
COMMIT (자율 트랜잭션) 100,000
[세션 통계 — 적재 한 번]
경과 시간 61.2초 (번호 없이 같은 INSERT … SELECT 를 돌리면 0.3초)
user commits 100,001
recursive calls 약 400,000
redo size 58.4MB
[새벽 보정 화면 — 적재가 도는 1분 동안]
FN_NEXT_NO 한 번 평소 0.002초 → 0.02 ~ 0.4초 · enq: TX - row lock contention 37번