테마
이 문제는 교재 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블록-- crontab · 매일 10:00 (개발팀)
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'ECOMMERCE',
estimate_percent => 100,
cascade => TRUE,
no_invalidate => FALSE);
END;
/
[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 ← 다시 파싱했지만 계획은 그대로