테마
본사 레거시 유통의 「매장 재고 확인」 화면은 매장 직원이 상품을 고를 때마다 재고 한 건을 읽는다. 작년에 이 화면도 PreparedStatement로 바꿨고, 하드 파싱은 사라졌다.
그런데 오전 10시대 ASH에는 library cache: mutex X가 여전히 보인다. 선배가 파라미터 이력을 뒤지다가 몇 해 전 DBA가 남긴 변경 기록을 찾았다. "세션 메모리 절약 (2017)"
CF18 일별상품재고: 408행 · 6블록 · PK (SHP_NO, ITM_NO, INV_BS_DT) · SHP_NO, ITM_NO는 NUMBER이고 INV_BS_DT는 VARCHAR2(8)다.session_cached_cursors = 0 · open_cursors = 300 · 화면 서버는 요청마다 PreparedStatement를 만들고 실행한 뒤 닫는다(문장 캐시는 쓰지 않는다).-- 2017년 DBA 변경 기록 (지금도 그대로다)
ALTER SYSTEM SET SESSION_CACHED_CURSORS = 0 SCOPE = SPFILE;
// StockDao.java : 요청마다 문장을 준비하고, 실행하고, 닫는다
String sql = "SELECT INV_QTY FROM CF18 WHERE SHP_NO = ? AND ITM_NO = ? AND INV_BS_DT = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, shpNo);
ps.setInt(2, itmNo);
ps.setString(3, bsDt);
try (ResultSet rs = ps.executeQuery()) { /* 한 건 */ }
}
[10046 → TKPROF · 화면 서버 세션 하나 · 오전 10시대 한 시간]
SELECT INV_QTY FROM CF18 WHERE SHP_NO = :1 AND ITM_NO = :2 AND INV_BS_DT = :3
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 4120 0.29 0.41 0 0 0 0
Execute 4120 0.11 0.13 0 0 0 0
Fetch 4120 0.04 0.05 0 8240 0 4120
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 12360 0.44 0.59 0 8240 0 4120
Misses in library cache during parse: 1
[V$SYSSTAT · 같은 한 시간 증가분 (인스턴스)]
execute count 182,400
parse count (total) 179,900
parse count (hard) 96
session cursor cache hits 0
[ASH · 10~11시 · 화면 서버 세션의 표본 비율]
CPU 71%
library cache: mutex X 8%
cursor: pin S 2%
Misses in library cache during parse 줄로 이 문장이 어떤 파싱을 하는지 설명하시오.