Skip to content
튜닝 연습소트 튜닝과 페이징
SORT-070

밤 체인의 고객 월별 구매 MV 새로 고침이 38초 걸리고 redo를 61MB 남긴다

기초PLSQL한빛유통375 / 700

상황 ​

CRM팀의 「고객 월별 구매」 화면과 캠페인 추출은 구체화 뷰 MV_CUS_MON(고객 2,000명 × 36개월 = 72,000행)을 직접 읽는다. 밤 체인의 02:00 단계가 이 MV를 기본 옵션 그대로 COMPLETE로 새로 고친다. 체인이 아침을 넘기는 날이 생겨 단계마다 시간을 재 보니 이 단계가 38초였고, 아카이브 로그도 이 단계에서 61MB가 생겼다. 원장 T_ORD_BIG을 한 번 읽어 묶는 데는 1초도 걸리지 않는다. 이 MV를 읽는 화면과 추출은 08시부터 돈다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록
  • MV_CUS_MON: 72,000행 · 410블록 · CUS_ID · ORD_YM · ORD_CNT · ORD_AMT · 인덱스 IX_MV_CUS_MON (CUS_ID, ORD_YM) · REFRESH COMPLETE ON DEMAND · LOGGING
  • 정의 쿼리: SELECT CUS_ID, TO_CHAR(ORD_DT, 'YYYYMM') AS ORD_YM, COUNT(*) AS ORD_CNT, SUM(ORD_AMT) AS ORD_AMT FROM T_ORD_BIG GROUP BY CUS_ID, TO_CHAR(ORD_DT, 'YYYYMM')
  • DB는 ARCHIVELOG 모드다 · 02:00 ~ 08:00에는 이 MV를 읽는 세션이 없다

원본 SQL ​

sql
-- 밤 체인 02:00 단계 (기본 옵션 그대로)
BEGIN
  DBMS_MVIEW.REFRESH(list => 'MV_CUS_MON', method => 'C');
END;

실행계획 학습용 예시 ​

xplan
[02:00 단계 · TKPROF 요약 (새로 고침이 낸 재귀 SQL)]
  문장                                        count     cpu   elapsed     query    current      rows
  DELETE FROM "SQLP"."MV_CUS_MON"                 1    9.84     14.92       418    221,903    72,000
  INSERT INTO "SQLP"."MV_CUS_MON" SELECT …        1   11.20     22.37     6,004    219,377    72,000
  그 밖의 재귀 SQL (사전 조회 · 기록)             38    0.41      0.68     1,212         96         —

[같은 단계 · 세션 통계 차이]
  redo size                64,118,220
  undo change vector size  19,604,312
  db block changes            447,206

[INSERT … SELECT 의 실행계획]
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
-------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |            |      1 |        |      0 |00:00:22.37 |     225K|          |
|   1 |  LOAD TABLE CONVENTIONAL | MV_CUS_MON |      1 |        |      0 |00:00:22.37 |     225K|          |
|   2 |   HASH GROUP BY          |            |      1 |  72000 |  72000 |00:00:00.61 |    5826 | 5243K (0)|
|   3 |    TABLE ACCESS FULL     | T_ORD_BIG  |      1 |   1000K|   1000K|00:00:00.08 |    5826 |          |
-------------------------------------------------------------------------------------------------------------

문제 ​

  1. 72,000행짜리 MV를 다시 만드는 데 redo가 61MB 생기고 38초가 걸리는 까닭을 TKPROF의 두 문장으로 설명하시오.
  2. 같은 MV를 같은 시각에 다시 만들되 redo와 시간을 줄이도록 새로 고침 호출을 고치시오.
  3. 고친 방식의 대가를 쓰고, 02시에 이 MV를 읽는 화면이 있었다면 어떻게 해야 하는지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자