테마
정산팀이 정산 목록 화면 맨 위에 "정산 최종 갱신 시각"을 띄워 달라고 해서, 지난달 개발자가 T_ORD_STLM에 트리거를 붙여 갱신 시각을 T_LOAD_STAMP에 적게 했다. 정산 등록 화면이 한 건을 넣을 때도, 야간 P1 적재가 10만 건을 넣을 때도 시각이 바뀐다.
그 뒤로 P1 적재가 0.4초에서 3.2초로 늘었다. 오과장이 고개를 갸웃했다. "트리거는 UPDATE 한 줄짜리인데요."
T_ORD(원천): 100,000행 · 896블록T_ORD_STLM 정산: P1이 비우고(TRUNCATE) 10만 건을 다시 넣는다 · 낮에는 정산 등록 화면이 하루 20건쯤 한 건씩 넣는다 · 인덱스 없음T_LOAD_STAMP 갱신 시각(이 문제용): 테이블마다 한 행 · PK (TBL_NM) · LAST_DT · LAST_PGMT_LOAD_STAMP에서 TBL_NM = 'T_ORD_STLM'인 행 하나만 읽는다. 정산팀이 원한 것은 "마지막으로 정산이 들어온 시각"이다.-- 지난달에 붙인 트리거
CREATE OR REPLACE TRIGGER TRG_STLM_STAMP
AFTER INSERT ON T_ORD_STLM
FOR EACH ROW
BEGIN
UPDATE T_LOAD_STAMP
SET LAST_DT = SYSDATE,
LAST_PGM = SYS_CONTEXT('USERENV', 'MODULE')
WHERE TBL_NM = 'T_ORD_STLM';
END;
/
-- P1 적재 (야간)
TRUNCATE TABLE T_ORD_STLM;
INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT)
SELECT ROWNUM, ORD_SEQ, CUS_ID, ORD_DT, ORD_AMT
FROM T_ORD;
COMMIT;
[세션 통계 — P1 적재 한 번]
트리거 붙이기 전 트리거 붙인 뒤
경과 시간 0.41 초 3.22 초
recursive calls 31 100,047
execute count 12 100,013
session logical reads 12,118 317,604
db block changes 10,962 216,031
redo size 7.9 MB 41.3 MB
undo change vector size 0.3 MB 10.9 MB
[TKPROF — 트리거 안의 UPDATE (dep=1)]
UPDATE T_LOAD_STAMP SET LAST_DT = SYSDATE, LAST_PGM = SYS_CONTEXT('USERENV', 'MODULE') WHERE TBL_NM = 'T_ORD_STLM'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 100000 1.71 1.86 0 100000 102461 100000
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 100001 1.71 1.86 0 100000 102461 100000