Skip to content
튜닝 연습PL/SQL과 사용자 정의 함수
PLSQL-040

「최종 갱신 시각」 표시를 넣은 뒤로 정산 적재가 0.4초에서 3.2초가 됐다

기초DDL한빛유통690 / 700

상황 ​

정산팀이 정산 목록 화면 맨 위에 "정산 최종 갱신 시각"을 띄워 달라고 해서, 지난달 개발자가 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_PGM
  • 화면은 T_LOAD_STAMP에서 TBL_NM = 'T_ORD_STLM'인 행 하나만 읽는다. 정산팀이 원한 것은 "마지막으로 정산이 들어온 시각"이다.

원본 SQL ​

sql
-- 지난달에 붙인 트리거
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;

실행계획 학습용 예시 ​

xplan
[세션 통계 — 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

문제 ​

  1. UPDATE 한 줄짜리 트리거 때문에 적재가 여덟 배 느려진 이유를 세션 통계와 TKPROF로 설명하시오.
  2. 화면에 보이는 갱신 시각의 뜻이 바뀌지 않게 트리거를 고치고, 고친 뒤의 일량을 숫자로 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자