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

매일 10시 정각이면 주문 화면들이 3분 동안 버벅인다

기초PLSQL이커머스600 / 700

이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.

상황 ​

ora-newshop 개발팀은 매일 10:00에 crontab으로 통계 스크립트를 돌린다. 스크립트 주석에는 이렇게 적혀 있다. "통계는 최신이 좋고, 새 통계는 바로 써야 한다." 10:00부터 10:03까지 주문 조회, 장바구니, 결제 화면의 응답이 0.1초에서 2 ~ 4초로 늘고, 10:04부터는 돌아온다. 운영팀은 CPU를 늘리자고 한다.

테이블과 인덱스 ​

  • 스키마 ECOMMERCE: 테이블 30개 · 가장 큰 product_views 100,000행 · 367블록, orders 34,908행 · 193블록
  • 공유 풀에 이 스키마를 읽는 커서가 약 3,800개 있다(화면 SQL은 바인드 변수를 쓴다).
  • 자동 통계 수집은 켜져 있다(평일 22:00부터 4시간). 스크립트를 만든 뒤로 밤의 자동 수집은 거의 할 일이 없다.
  • CPU 2개(Free)

원본 SQL ​

sql
-- crontab · 매일 10:00 (개발팀)
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(ownname          => 'ECOMMERCE',
                                 estimate_percent => 100,
                                 cascade          => TRUE,
                                 no_invalidate    => FALSE);
END;
/

실행계획 학습용 예시 ​

xplan
[09:59 ~ 10:04 · 1분 단위 · 시스템 통계와 ASH 요약]
 시각    hard parses/s   parse time cpu / DB CPU   활성 세션   상위 대기 (ASH 표본)
 09:59        0.4                  1%                 0.6      -
 10:00       61.3                 72%                 4.8      cursor: pin S wait on X · library cache lock
 10:01       58.8                 70%                 4.5      cursor: pin S wait on X · row cache mutex
 10:02       44.1                 61%                 3.1      library cache: mutex X
 10:03       12.7                 23%                 1.2      -
 10:04        0.6                  1%                 0.6      -

[GATHER_SCHEMA_STATS 한 번 (10:00:00 ~ 10:00:41)]
 테이블 30개 · 인덱스 44개 · 그중 STALE 이던 테이블 2개 (orders · point_transactions)
 column histograms : HEIGHT BALANCED 3개 (estimate_percent 100 으로 모은 status · grade · tx_type)

[V$SQL — orders 를 읽는 주문 조회 SQL 하나]
 10:00 직전  CHILD 0 · INVALIDATIONS 4 · PLAN_HASH_VALUE 3312650782
 10:00 직후  CHILD 0 · INVALIDATIONS 5 · PLAN_HASH_VALUE 3312650782   ← 다시 파싱했지만 계획은 그대로

문제 ​

  1. 10시 정각의 3분이 무엇 때문인지 위 숫자로 설명하시오. 통계 대부분이 거의 바뀌지 않았는데도 화면이 느려진 까닭을 쓰시오.
  2. 통계 스크립트를 고치시오. 언제, 무엇을, 어떤 무효화 옵션으로 모을지와 그 근거를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자