테마
09:11에 조민우가 알려 왔다. "오늘 아침에 등록한 정산이 전부 정산일 6/14(금)로 찍혀 있어요. 금요일 저녁 6시 넘어서 등록한 것도 6/14고요."
금요일 17:30에 정산 등록 화면의 응답 시간을 줄이려고, 화면이 호출하는 정산일 함수에 RESULT_CACHE 한 단어를 붙였다. 반영 전 연습 DB 대조(건수, 합계, MINUS)는 금요일 오후에 돌렸고 결과가 같았다.
T_ORD_STLM 정산: 100,000행 · 640블록 · STLM_DT 정산일(전부 과거 날짜)result_cache_mode = MANUAL · result_cache_integrity = TRUSTED-- 정산일 함수 — 2019 강도현 (18시 마감 · DETERMINISTIC) + 6/14 17:30 'RESULT_CACHE' 한 단어
CREATE OR REPLACE FUNCTION FN_STLM_DT RETURN DATE DETERMINISTIC RESULT_CACHE IS
BEGIN
RETURN TRUNC(SYSDATE + 6/24); -- 18:00 + 6시간 = 다음 날 0시 → 18시 이후 등록은 다음 날 정산
END;
/
-- 정산 등록 화면이 부르는 곳
INSERT INTO T_ORD_STLM (STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT)
VALUES (:seq, :ord_seq, :cus_id, FN_STLM_DT, :amt);
SELECT STLM_SEQ, ORD_SEQ, CUS_ID, STLM_DT, STLM_AMT -- 목록 : 정산일까지 온 정산
FROM T_ORD_STLM
WHERE STLM_DT <= FN_STLM_DT;
[V$RESULT_CACHE_OBJECTS — 6/17 (월) 09:30]
TYPE STATUS NAME CREATION_TIMESTAMP
Dependency Published SQLP.FN_STLM_DT 06/14 17:31:02
Result Published "SQLP"."FN_STLM_DT"::8."FN_STLM_DT"#… #1 06/14 17:31:02
[V$RESULT_CACHE_DEPENDENCY — 정산일 결과가 기대는 객체]
SQLP.FN_STLM_DT (함수 자신 하나 — 그 사이 정산 등록이 계속 커밋됐지만 Published 그대로)
[등록된 정산일]
등록 시각 찍힌 STLM_DT 규칙대로라면
06/14 (금) 17:45 2024-06-14 2024-06-14
06/14 (금) 18:20 2024-06-14 2024-06-15
06/17 (월) 08:55 2024-06-14 2024-06-17
[목록 문장 — 정산 10만 행 · 세 판 모두 같은 계획 (TABLE ACCESS FULL · 계획 해시도 같다)]
판 함수 본문 실행 결과 캐시 찾기 Buffers
그냥 함수 (DETERMINISTIC 없이) 100,000 0 640
2019 원본 (DETERMINISTIC) 1 0 640
6/14 판 (+ RESULT_CACHE) 0 1 640