Skip to content
튜닝 연습파싱과 바인드 변수
PARSE-007

하드 파싱은 한 번뿐인데 TKPROF의 Parse 줄이 실행 수만큼 찍힌다

기초DDL유통552 / 700

상황 ​

본사 레거시 유통의 「매장 재고 확인」 화면은 매장 직원이 상품을 고를 때마다 재고 한 건을 읽는다. 작년에 이 화면도 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)다.
  • 한 번 실행하면 PK로 2블록을 읽는다.
  • session_cached_cursors = 0 · open_cursors = 300 · 화면 서버는 요청마다 PreparedStatement를 만들고 실행한 뒤 닫는다(문장 캐시는 쓰지 않는다).

원본 SQL ​

sql
-- 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()) { /* 한 건 */ }
}

실행계획 학습용 예시 ​

xplan
[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%

문제 ​

  1. TKPROF의 Parse 줄과 Misses in library cache during parse 줄로 이 문장이 어떤 파싱을 하는지 설명하시오.
  2. 세션 커서 캐시가 무엇을 덜어 주는지 쓰고 파라미터를 고치시오. 반영하는 방법과 이 조치의 한계도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자