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

상담원이 주문 세 건을 골라 상세를 펼치면 주문 테이블 두 개를 통째로 읽는다

기초SELECT한빛유통607 / 700

상황 ​

상담 화면 「주문 묶음 상세」는 상담원이 고른 주문(보통 1 ~ 5건)을 전역 임시 테이블 GT_ORD_PICK에 넣고 상세를 펼친다. 상담원 40명이 하루 약 2만 번 쓴다. 이 화면이 붙는 접속 풀은 접속할 때마다 업체가 2012년 튜닝 가이드에 적은 초기화 SQL을 실행한다. 가이드의 설명은 "동적 샘플링을 끄면 파싱 시간이 준다" 한 줄이다.

테이블과 인덱스 ​

  • GT_ORD_PICK: 전역 임시 테이블(ON COMMIT PRESERVE ROWS) · ORD_SEQ · 세션마다 1 ~ 5행 · 통계 없음
  • T_ORD: 100,000행 · 896블록 · PK_T_ORD (ORD_SEQ)
  • T_ORD_DET: 200,000행 · 896블록 · PK_T_ORD_DET (ORD_SEQ, ORD_DET_NO) · 주문당 1 ~ 3건
  • 블록 크기 8KB · 화면 SQL은 바인드 변수가 없다(고른 주문은 임시 테이블로만 넘긴다).

원본 SQL ​

sql
-- 접속 풀 초기화 SQL (업체 · 2012년 튜닝 가이드)
ALTER SESSION SET OPTIMIZER_DYNAMIC_SAMPLING = 0;

-- 「주문 묶음 상세」 (고른 주문을 GT_ORD_PICK 에 넣은 뒤)
SELECT o.ORD_SEQ, o.ORD_DT, o.ORD_ST, d.ORD_DET_NO, d.ITM_ID, d.ORD_QTY, d.UNT_PRC
  FROM GT_ORD_PICK g, T_ORD o, T_ORD_DET d
 WHERE o.ORD_SEQ = g.ORD_SEQ
   AND d.ORD_SEQ = o.ORD_SEQ
 ORDER BY o.ORD_SEQ, d.ORD_DET_NO

실행계획 학습용 예시 ​

xplan
[상담원이 주문 3건을 고른 경우]
---------------------------------------------------------------------------------------------------
| Id  | Operation            | Name        | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |      1 |        |      6 |00:00:00.03 |    1793 |          |
|   1 |  SORT ORDER BY       |             |      1 |  16336 |      6 |00:00:00.03 |    1793 | 2048  (0)|
|*  2 |   HASH JOIN          |             |      1 |  16336 |      6 |00:00:00.03 |    1793 | 1164K (0)|
|*  3 |    HASH JOIN         |             |      1 |   8168 |      3 |00:00:00.02 |     897 | 1236K (0)|
|   4 |     TABLE ACCESS FULL| GT_ORD_PICK |      1 |   8168 |      3 |00:00:00.01 |       1 |          |
|   5 |     TABLE ACCESS FULL| T_ORD       |      1 |    100K|    100K|00:00:00.01 |     896 |          |
|   6 |    TABLE ACCESS FULL | T_ORD_DET   |      1 |    200K|    200K|00:00:00.01 |     896 |          |
---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("D"."ORD_SEQ"="O"."ORD_SEQ")
   3 - access("O"."ORD_SEQ"="G"."ORD_SEQ")

문제 ​

  1. 4번 줄의 E-Rows 8,168이 어디서 나온 숫자인지 쓰고, 그 숫자 때문에 고른 계획을 설명하시오.
  2. 화면 SQL은 그대로 두고 고치시오. 업체 가이드의 "파싱 시간이 준다"는 설명이 이 화면에 맞는지도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자