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

적응형 기능을 다 켜야 추정이 맞는다며 설정 한 줄을 넣은 뒤로 처음 보는 문장이 실행 횟수 1위에 올랐다

중급DDL한빛유통646 / 700

상황 ​

지난주 금요일 18:20 오과장이 운영 DB에 설정 한 줄을 넣었다. "12c 적응형 기능을 다 켜야 E-Rows가 맞는대요. 기본값이 FALSE인 건 보수적이라서고요." 월요일 AWR의 「SQL ordered by Executions」 1위에 처음 보는 문장이 올라왔고, 하드 파싱 시간이 세 배로 늘었다. 정산팀은 「고객 취소 주문」 화면이 가끔 한 박자 늦게 뜬다고 한다. 박팀장은 그 설정을 그대로 둘지 정해 달라고 했다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · 고객마다 상태가 하나(CANCEL 고객 40명 · 고객당 500건) · ORD_ST에 FREQUENCY 히스토그램(통계 수집 정책서 1호, 5월 6일부터)
  • SQL Plan Directive: 5월부터 테이블 4개에 지시문 11개가 쌓여 있다(기본 설정에서는 적어 두기만 한다)
  • 그 밖의 옵티마이저 설정은 기본값 · Diagnostic Pack 계약 있음

원본 SQL ​

sql
-- 금요일 18:20 (오과장)
ALTER SYSTEM SET optimizer_adaptive_statistics = TRUE SCOPE = BOTH;

-- 정산팀 「고객 취소 주문」 (고객 번호는 화면이 리터럴로 넣는다)
SELECT ORD_SEQ, ORD_DT, ORD_AMT
  FROM T_ORD_BIG
 WHERE CUS_ID = 'CUS_000001'
   AND ORD_ST = 'CANCEL';

실행계획 학습용 예시 · E-Rows는 교재 10화 §10의 실측값 ​

xplan
[AWR · 월 09:00 ~ 10:00 · 지난주 월요일 같은 시간과 비교]
 hard parse elapsed time        41.2초 → 133.8초
 SQL ordered by Executions 1위  (지난주 0번 → 18,240번)
   SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring optimizer_features_enable(default) result_cache */
          SUM(C1) FROM (SELECT /*+ qb_name("innerQuery") NO_INDEX_FFS("T_ORD_BIG") */ 1 AS C1
                          FROM "T_ORD_BIG" SAMPLE BLOCK(…) WHERE …) innerQuery

[DBA_SQL_PLAN_DIRECTIVES · DBA_SQL_PLAN_DIR_OBJECTS · T_ORD_BIG]
 DIRECTIVE  TYPE              STATE   REASON                                CREATED  LAST_USED   대상 열
 …4417      DYNAMIC_SAMPLING  USABLE  SINGLE TABLE CARDINALITY MISESTIMATE  05-06    월 09:12    CUS_ID, ORD_ST
 …9203      DYNAMIC_SAMPLING  USABLE  SINGLE TABLE CARDINALITY MISESTIMATE  05-06    월 09:31    ORD_DT, ORD_ST

[「고객 취소 주문」 · 하드 파싱될 때마다]
 금요일 전(FALSE)   E-Rows 10                        Note 없음
 월요일 1회차       E-Rows 500   Note: dynamic statistics used: dynamic sampling (level=AUTO)
 월요일 2회차       E-Rows 500         1 Sql Plan Directive used for this statement
 월요일 3회차       E-Rows 537
 월요일 4회차       E-Rows 555
 실제 A-Rows 500 · 계획은 넷 다 같다(TABLE ACCESS FULL · 5,826블록)

[참고 · 지시문 …9203 이 생긴 날의 조건(10화)]
 6월 AND CANCEL   히스토그램 없음 9,445 · FREQUENCY 567 · 실제 549

문제 ​

  1. 설정 한 줄 뒤에 일어난 일을 지시문, 동적 샘플링, 하드 파싱으로 설명하시오. 같은 SQL의 E-Rows가 하드 파싱마다 다른 이유도 쓰시오.
  2. 이 설정을 그대로 둘지 판단하고 SQL로 정리하시오. 지시문 두 개를 각각 어떻게 다룰지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자