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

반기 점검에서 진화 리포트 세 장을 받았는데 오과장은 통과한 것을 다 받아들이고 인덱스 정리도 대장대로 하자고 한다

실전PLSQL한빛유통647 / 700

상황 ​

10월 반기 점검(T8) 날이다. 조민우가 대기 줄(ACCEPTED NO)이 있는 핵심 SQL 세 개에 진화 작업을 돌려 리포트를 가져왔다. 오과장은 결재 올릴 작업 목록을 내밀었다. "과제 셋을 IMPLEMENT로 받아들이고, 인덱스 정리 대장대로 11월에 IX_ORD_BIG_DT_SEQ도 지우죠. 대장에 사용 기록 0건이라고 적혀 있잖아요." 박팀장은 이렇게 말했다. "받아들일 것, 미룰 것, 지울 것을 하나씩 근거를 붙여서요."

테이블과 인덱스 ​

  • T_ORD_STLM: 100,000행 · 640블록 · 2025년 7월에 IX_STLM_DT_AMT (STLM_DT, STLM_AMT)를 만들었다
  • T_ORD_BIG: 1,000,000행 · 5,826블록 · 인덱스 IX_ORD_BIG_DT · IX_ORD_BIG_DT_AMT · IX_ORD_BIG_DT_SEQ (ORD_DT, ORD_SEQ)(2024년 4월, 09화)
  • M_CUS: 2,000행 · 30블록 · PK_M_CUS (CUS_ID)
  • 세 SQL의 베이스라인은 2023년 9월에 커서 캐시에서 올렸다. 그때는 IX_ORD_BIG_DT_SEQ와 IX_STLM_DT_AMT가 없었다.
  • A 「월 정산 합계」 하루 약 200번 · B 「등급별 정산 집계」 하루 약 50번 · C 「주문 목록 첫 페이지」(최신 10건) 하루 약 30번
  • 2025-03-10 밤 T_ORD_STLM 재적재 중에 모인 빈 테이블 통계(NUM_ROWS 0)가 하루 동안 쓰였다

원본 SQL ​

sql
-- 오과장 안 ① 세 과제를 모두 받아들인다
DECLARE
  r NUMBER;
BEGIN
  r := DBMS_SPM.IMPLEMENT_EVOLVE_TASK(task_name => 'SPM_T8_ALL');   -- A, B, C 를 한 과제로 돌렸다
END;
/

-- 오과장 안 ② 인덱스 정리 대장 2호대로 11월 정기 작업에서 지운다
DROP INDEX IX_ORD_BIG_DT_SEQ;

실행계획 학습용 예시 ​

xplan
[DBA_SQL_PLAN_BASELINES · 대기 줄이 있는 셋]
 SQL  PLAN_NAME        ORIGIN                         ACCEPTED  CREATED   계획
 A    SQL_PLAN_…a1     MANUAL-LOAD-FROM-CURSOR-CACHE  YES       23-09-04  TABLE ACCESS FULL T_ORD_STLM
 A    SQL_PLAN_…a2     AUTO-CAPTURE                   NO        25-07-21  INDEX RANGE SCAN IX_STLM_DT_AMT
 B    SQL_PLAN_…b1     MANUAL-LOAD-FROM-CURSOR-CACHE  YES       23-09-04  HASH JOIN (M_CUS · T_ORD_STLM FULL)
 B    SQL_PLAN_…b2     AUTO-CAPTURE                   NO        25-03-10  NESTED LOOPS (T_ORD_STLM → PK_M_CUS → M_CUS)
 C    SQL_PLAN_…c1     MANUAL-LOAD-FROM-CURSOR-CACHE  YES       23-09-04  TABLE ACCESS FULL T_ORD_BIG + SORT ORDER BY STOPKEY
 C    SQL_PLAN_…c2     AUTO-CAPTURE                   NO        24-04-29  INDEX RANGE SCAN DESCENDING IX_ORD_BIG_DT_SEQ + COUNT STOPKEY

[진화 리포트 (REPORT_EVOLVE_TASK · SPM_T8_ALL) · 실행 통계와 FINDINGS만 옮겨 적음]
 SQL  계획   Elapsed(초)  Buffer Gets  Rows Processed  FINDINGS
 A    기준      .006100          640               1
      시험      .000210           13               1   passed the benefit criterion ... 48.92308 times better
 B    기준      .052000          672               3
      시험      .690000      102,741               3   failed the benefit criterion ... 0.00654 times worse
 C    기준      .118000        5,826              10
      시험      .000400           14              10   passed the benefit criterion ... 416.14286 times better

[인덱스 정리 대장 2호 · 2025-09-30 작성]
 IX_ORD_BIG_DT_SEQ (ORD_DT, ORD_SEQ)
  근거 : 최근 30일 V$SQL_PLAN과 DBA_HIST_SQL_PLAN에서 이 인덱스를 쓴 계획 0건 · DBA_INDEX_USAGE 0
  결론 : 11월 정기 작업에서 DROP (적재할 때 고칠 인덱스를 하나 줄인다)

문제 ​

  1. 세 리포트를 읽고 A, B, C의 대기 계획을 각각 받아들일지 정하시오. 리포트의 어느 칸을 근거로 삼았는지 쓰시오.
  2. C의 리포트가 인덱스 정리 대장의 결론과 어긋나는 이유를 설명하고, 대장을 어떻게 고칠지 쓰시오.
  3. 고른 결정을 SQL로 쓰시오. 계획을 받아들이고 지우는 일의 부작용과 다음 점검 때 다시 볼 것도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자