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

야간 통계 잡은 석 달째 매일 성공인데 테이블 여섯 개의 통계가 3월에 멈춰 있다

중급PLSQL유통608 / 700

상황 ​

본사 레거시 DB의 야간 통계 잡 PKG_STATS.NIGHTLY는 매일 23:40에 목록 표 STATS_TARGET의 테이블을 이름순으로 하나씩 모은다. 스케줄러 이력은 석 달째 매일 SUCCEEDED다. 3월 4일 DBA는 상품가격 개편(3월 ~ 5월) 동안 CF05의 통계가 흔들리지 않게 잠갔다. 6월 12일 조민우가 점장 화면을 보다가 CF10의 LAST_ANALYZED가 3월 3일인 것을 발견했다.

테이블과 인덱스 ​

  • STATS_TARGET의 목록(이름순): CF01 · CF02 · CF05 · CF07 · CF10 · CF12 · CF13 · CF15 · CF18
  • CF05 상품가격: 157행 · 5블록 · 3월 4일부터 STATTYPE_LOCKED = ALL
  • CF10 판매: 500,000행 · 4,583블록 · 하루 약 700건씩 늘어난다 · CF18 일별상품재고: 매일 408행씩 늘어난다
  • 자동 통계 수집은 2016년부터 꺼져 있다. 잡이 실패로 끝나면 감시 시스템이 알림을 보낸다.

원본 SQL ​

sql
PROCEDURE NIGHTLY IS            -- PKG_STATS · 매일 23:40 (DBMS_SCHEDULER)
BEGIN
  FOR t IN (SELECT TABLE_NAME FROM STATS_TARGET ORDER BY TABLE_NAME) LOOP
    DBMS_STATS.GATHER_TABLE_STATS('PUP', t.TABLE_NAME);
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    PKG_LOG.WRITE('NIGHTLY', '통계 수집 경고 : ' || SQLERRM);      -- 잡은 '성공'으로 끝난다
END;

-- 3월 4일 10:12 · DBA : 가격 개편 동안 CF05 통계가 흔들리지 않게
EXEC DBMS_STATS.LOCK_TABLE_STATS('PUP', 'CF05');

실행계획 학습용 예시 ​

xplan
[PKG_LOG — NIGHTLY (최근 사흘)]
 06-09 23:40:01  NIGHTLY 시작
 06-09 23:40:02  통계 수집 경고 : ORA-20005: object statistics are locked (stattype = ALL)
 06-10 23:40:01  NIGHTLY 시작
 06-10 23:40:02  통계 수집 경고 : ORA-20005: object statistics are locked (stattype = ALL)
 06-11 23:40:01  NIGHTLY 시작
 06-11 23:40:02  통계 수집 경고 : ORA-20005: object statistics are locked (stattype = ALL)

[DBA_SCHEDULER_JOB_RUN_DETAILS — NIGHTLY]  STATUS SUCCEEDED · 3월 4일부터 100일 연속

[USER_TAB_STATISTICS — 목록 순서대로 · 6월 12일 09:00]
 TABLE_NAME   LAST_ANALYZED   STATTYPE_LOCKED   STALE_STATS
 CF01         06-11 23:40     -                 NO
 CF02         06-11 23:40     -                 NO
 CF05         03-04 10:12     ALL               NO
 CF07         03-03 23:41     -                 NO
 CF10         03-03 23:41     -                 YES
 CF12         03-03 23:42     -                 YES
 CF13         03-03 23:42     -                 YES
 CF15         03-03 23:42     -                 YES
 CF18         03-03 23:42     -                 YES

문제 ​

  1. CF05 하나를 잠갔는데 그 뒤의 여섯 테이블까지 3월에 멈춘 이유와, 잡이 100일 동안 성공으로 끝난 이유를 쓰시오.
  2. 오늘 할 일과 야간 잡을 고친 SQL을 쓰시오. CF05의 잠금은 어떻게 할지와 그 근거도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자