행위

오라클 MVIEW

DB CAFE

thumb_up 추천메뉴 바로가기


1 오라클 MVIEW (Materialized View)[편집]

  1. 일반 뷰는 사용자가 뷰를 이용할 때 뷰의 담겨진 서브쿼리를 이용하여 원래의 테이블에서 실제 데이터를 가져와 사용자에게 주고, 데이터를 view에서 삭제.
  2. MView는 한 사용자가 MView를 이용할 때 데이터를 가져오고 사용자에게 반환하고 뷰에서 삭제하지 않음
    다른 사용자들은 MView를 이용할 때 데이터를 버퍼 캐시에서 꺼내오는 것이 아니라 MView 내에 이미 만들어진 데이터를 이용하여 성능 향상을 기대.
  3. MView 단점 : 원본 테이블과의 데이터 동기화 문제 발생 .
    MView의 동기화를 시켜주는 패키지를 제공. MView 정의 시 옵션을 설정하여 commit 명령을 사용할 때 MView의 내용이 동기화 처리


1.1 MView 생성[편집]

-- 쿼리 수정 권한 부여 
GRANT QUERY REWRITE TO 유저명;
-- M/V 생성권한 부여 
GRANT CREATE MATERIALIZED VIEW TO 유저명;
-- M/V 생성 
CREATE MATERIALIZED VIEW VIEW이름
 BUILD IMMEDIATE
REFRESH ON [ DEMAND | COMMIT]
[ COMPLETE ] | FAST | FORCE | NEVER ]
ENABLE QUERY REWRITE
AS <서브쿼리>;
  • BUILD IMMEDIATE : MView를 생성하는 즉시 서브쿼리를 수행해서 데이터를 MView에 저장
  • DEMAND , COMMIT : demand - DBMS_MVIEW 패키지의 동기화 관련 프로시저를 실행할 경우, MView의 데이터가 원본 데이터와 동기화
    commit - 원본 테이블에서 데이터 변경 후 commit 명령을 사용하면 MView와 자동으로 동기화.
  • 동기화 범위 : COMPLETE or FAST or FORCE or NEVER
    COMPLETE : MView의 모든 데이터 동기화.
    FAST : 원본 테이블에 수정된 부분만 동기화. 이 방법을 사용하기 위해 MView Log 오브젝트를 생성해야 함.
    FORCE : FAST 기법이 가능하면 FAST 기법을 사용하고 그렇지 않다면 COMPLETE 기능 사용.
    NEVER : 동기화를 사용하지 않음.
  • ENABLE QUERY REWRITE : A 사용자가 특정 결과를 조회하는 SQL을 만들어서 실행했을 때, 다른 하나의 MView의 서브쿼리와 같은 내용을 지닌 SQL이라면 사용자가 만든 SQL 쿼리의 데이터를 버퍼 캐시나 데이터파일에서 구하는 것이 아니라 그 MView에 담긴 데이터에서 구하도록 변경.

1.1.1 MView Log 오브젝트 생성[편집]

  • MView를 FAST 기능을 사용하도록 만든다면 MView Log 오브젝트 필요.
  • MView Log 오브젝트의 생성문법
CREATE MATERIALIZED VIEW LOG ON 스키마.테이블명
[PCTFREE number]
[PCTUSED number]
[INITTRANS number]
[MAXTRANS number]
[TABLESPACE tsName]
[LOGGING | NOLOGGING]
[CACHE | NOCACHE]
[NOPARALLEL | PARALLEL [number] ]
[Partition-serving query]
[
// (WITH ~) 옵션은 필수
// OBJECT ID | PRIMARY KEY | ROWID | SEQUENCE 중 한 옵션을 사용
WITH
[[OBJECT ID] [column_name, column_name2, ...]]
[[PRIMARY KEY][column_name]]
[[ROWID][column_name, column_name2, ...]]
[[SEQUENCE][column_name, column_name2, ...]]
]

[[INCLUDING | EXCLUDING] NEW VALUES] 
;

예시 )

  1. MVIEW 패키지를 이용한 동기화 처리
    1. "dbms_.mview.refresh" 프로시저들 사용해서 동기화를 진행.
  2. <mv_XXX> 뷰를 조회하면 원본 테이블에 새로 추가된 레코드가 mv_emp 뷰에도 나타나는 것을 볼 수 있음.
  3. MView의 동기화 속성이 "demand"일 경우 dbms_mview 패키지의 동기화 관련 프로시저를 적용해야 MView에서 최근의 데이터 확인 가능
  4. dbms_mview의 3가지 프로시저
    1. EXEC DBMS_MVIEW.REFRESH('MView 이름');
      // 해당 MView를 원본 테이블과 동기화.
    2. EXEC DBMS_MVIEW.REFRESH_DEPENDENT('테이블이름');
      // 해당 테이블을 원본 소스로 한 모든 MView 들을 동기화.
    3. EXEC DBMS_MVIEW.REFRESH_ALL_MVIEWS;
      // 해당 스키마의 모든 MView를 동기화.

MView의 대한 정보를 알고 싶으면 아래와 같이 딕셔너리 뷰를 조회하면 됩니다.

SELECT MVIEW_NAME      , QUERY
     , REWRITE_ENABLED , REFRESH_MODE
     , REFRESH_METHOD  , LAST_REFRESH_DATE
  FROM USER_MVIEWS
 WHERE MVIEW_AME = 'MV_EMP';

MView를 생성하고 난 후 현재 스키마에 테이블들을 조회

1.2 MView와 MView log 삭제[편집]

DROP MATERIALIZED VIEW MV_EMP;
DROP MATERIALIZED VIEW LOG ON EMPLOYEES;