Programer Life/DB

MView 엠뷰 준비, 생성, 자동리플래시, Materialized View Auto Manual Refresh

신비마마 2010. 2. 25. 11:15

1. 준비 사항

  - 유저에게 권한 부여

    : grant create materialized view to 유저명

  - Rewrite 기능 Enabled

    : ALTER SYSTEM SET QUERY_REWRITE_ENABLED='TRUE';

  - 옵티마이저 모드 변경

    : ALTER SESSION SET OPTIMIZER_MODE='FIRST_ROWS';

  - Job Processes 설정

    : C:\oracle\product\10.2.0\db_1\srvm\admin 안에 있는 init.ora 파일을 열어서

    : job_queue_processes = 10
     # job_queue_processes = 10 #datawarehouse

     # job_queue_interval = 10
     job_queue_keep_connections = true

 

2. 생성

  - Create 소스 테이블 ( F_SALES, D_ITEM)

    : CREATE TABLE F_SALES (
            YMD_CD NUMBER not null,
            ITEM_CD VARCHAR2(20) not null,
           EMP_NO NUMBER not null,
           SALE_AMT NUMBER,
           SALE_QTY NUMBER);

    : CREATE TABLE D_ITEM (
           ITEM_CD  VARCHAR2(20),
           ITEM_NM  VARCHAR2(20));

  - 테스트 값 입력

    : insert into f_sales values (20080509, 'ORA0001', 10, 15000000, 1); commit;

    : insert into d_item values ('ORA0001', 'BIEE_101332'); commit;

  - Mview 로그 만들기 ( Auto Refresh를 위해 필요)

    : create materialized view log on F_SALES with rowid including new values;

  - Mview 생성

    : CREATE MATERIALIZED VIEW MV_SALES
      USING INDEX
      REFRESH FORCE
      --START WITH sysdate
      --NEXT SYSDATE+(1/24/60)
      WITH ROWID
      ENABLE QUERY REWRITE
      AS
     SELECT A.YMD_CD YMD_CD, A.EMP_NO EMP_NO, B.ITEM_NM, SUM(A.SALE_AMT) SALE_AMT, SUM(A.SALE_QTY) SALE_QTY
     FROM F_SALES A, D_ITEM B
     WHERE A.ITEM_CD=B.ITEM_CD
     GROUP BY A.YMD_CD, A.EMP_NO, B.ITEM_NM

  - Mview 수정 ( 오라클 버그로 인해 위 주석처리 한 부분을 수정해줘야 함, 1분에 한번 리플래시되도록)

    : alter MATERIALIZED VIEW MV_SALES1 REFRESH FORCE START WITH sysdate NEXT SYSDATE+(1/24/60) WITH ROWID;

 

3. 검증

  - Job이 제대로 등록되었는지 확인( LAST_DATE 와 NEXT_DATE 를 확인한다.)

    : select * from user_jobs;

  - Mview가 제대로 생성되었는지 확인

    : SELECT * FROM MV_SALES;

  - Mivew Refresh 기능 확인을 위해 INSERT

    : insert into f_sales values (20080509, 'ORA0001', 8, 15000000, 1); commit;

  - Refresh 확인

    : Job에 나와있는 Next_date 이후 시간에 SELECT * FROM MV_SALES;

 

 

4. 참고

  - Mview Log 확인하기

    : select * from dba_mview_logs

- 수동으로 Refresh 하기

    : execute dbms_refresh.refresh('"BKMIN"."MV_SALES"');

 

작성 : 본인

도움 : Prodba 카페의 '용돌이' 님

출처 : http://cafe.naver.com/prodba

에서 질문하고 답변 얻고 해서 정리했어요~