Skip to content
튜닝 연습옵티마이저와 통계
OPT-045

옵티마이저 설정을 기본값으로 되돌린 뒤 소스가 없는 점포 판매 조회 화면만 첫 줄이 늦게 뜬다

중급PLSQL유통635 / 700

상황 ​

지난달 정기 점검에서 본사 유통 DB의 옵티마이저 설정을 기본값(ALL_ROWS)으로 되돌렸다(OPT-041의 절차). 반복 SQL은 미리 베이스라인으로 올려 두어 대부분 그대로였는데, 2009년에 만든 PowerBuilder 「점포 판매 조회」 화면 하나가 느려졌다. 한 달에 며칠만 쓰여서 베이스라인을 올릴 때 커서 캐시에 없었다. 이 화면은 소스가 남아 있지 않아 SQL을 고칠 수 없다. 결과를 20행씩 보여 주고, 사용자는 대부분 첫 화면만 보고 닫는다. 이 DB에는 Tuning Pack이 없다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록 · CF10_PK (SLE_NO)(SLE_NO는 날짜로 시작해 판매 순서와 같다) · 매장 6곳(매장당 약 83,000건)
  • CF11 판매상품: 1,096,708행 · 8,204블록 · CF11_PK (SLE_NO, ITM_NO) 높이 3 · 판매 한 건에 평균 2.2줄
  • 화면 SQL의 SQL_ID는 7w2q9cj1sd0m4이다(V$SQL에서 찾았다).

원본 SQL ​

sql
-- PowerBuilder 화면이 보내는 SQL (소스 없음 · 고칠 수 없다)
SELECT a.SLE_NO, a.SLE_DT, a.SLE_HMS, b.ITM_NO, b.SLE_QTY
  FROM CF10 a, CF11 b
 WHERE a.SHP_NO = :1
   AND b.SLE_NO = a.SLE_NO
 ORDER BY a.SLE_NO DESC

실행계획 학습용 예시 ​

xplan
[기본값으로 되돌린 뒤 — 첫 화면 20행을 받고 닫았을 때]
----------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads | Used-Mem |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |        |      1 |        |     20 |00:00:00.93 |   12787 |  8120 |          |
|   1 |  SORT ORDER BY      |        |      1 |    182K|     20 |00:00:00.93 |   12787 |  8120 |   11M (0)|
|*  2 |   HASH JOIN         |        |      1 |    182K|    182K|00:00:00.71 |   12787 |  8120 |   13M (0)|
|*  3 |    TABLE ACCESS FULL| CF10   |      1 |  83333 |  83312 |00:00:00.08 |    4583 |     0 |          |
|   4 |    TABLE ACCESS FULL| CF11   |      1 |   1096K|   1096K|00:00:00.42 |    8204 |  8120 |          |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("B"."SLE_NO"="A"."SLE_NO")
   3 - filter("A"."SHP_NO"=:1)

[되돌리기 전 — FIRST_ROWS 설정 · AWR 의 같은 SQL_ID]  CF10_PK 를 거꾸로 읽는 NL · 20행 · 42블록 · 0.01초

문제 ​

  1. 설정을 되돌린 뒤 이 화면의 첫 화면이 늦어진 이유를 실행계획으로 설명하시오.
  2. SQL 글자와 인스턴스 설정을 바꾸지 않고 이 SQL에만 최적화 목표를 알려 주시오. 적용됐는지 확인하는 방법도 쓰시오.
  3. 다른 방법(SQL 프로파일, 로그온 트리거, SQL plan baseline)과 견줘 그 방법을 고른 이유를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자