Materilaized View[MView]

Materialized View에 대해 개념 정리한 내용입니다
Materailized-ViewMView#DB
avatar
2025.02.19
·
12 min read

Materialized View(MView)

  • 구체화된 뷰, 데이터베이스에서 쿼리를 미리 계산하여 저장하는 물리적인 테이블

  • 복잡한 쿼리로 인해 성능 문제를 완화하기 위해 사용

Materialized View vs. View

  1. 데이터 조회 소요 시간

    분류

    내용

    Materialized View

    물리적인 테이블, 데이터를 사전에 계산하여 테이블에 저장

    미리 계산된 결과를 바로 조회함으로 빠르게 데이터를 조회할 수 있음

    View

    가상 테이블, 쿼리 실행시 원본 테이블을 접근하여 데이터 조회

    데이터 조회 속도가 원본 테이블 성능이나 쿼리(SQL)문의 복잡도에 따라 달라짐

  2. 데이터 갱신

    분류

    내용

    Materialized View

    이미 계산된 결과값이 물리적으로 저장, 원본테이블이 변경되면 해당 변경된 내용을 수동으로 반영해줘야 함 (옵션에 따라 제한적인 자동도 가능)

    View

    쿼리 실행할 때마다 원본 테이블 접근하므로 원본 테이블이 변경되면 변경사항이 즉시 반영된 결과를 조회할 수 있음

  3. 데이터 저장 유무

    분류

    내용

    Materialized View

    실제 데이터를 저장, 쿼리결과를 사전에 저장하며 실시간으로 업데이트 되지 않음. (옵션에 따라 제한적인 자동 가능)

    View

    가상 테이블, 뷰를 생성하는 쿼리가 실행될 때 실시간으로 결과 생성 (테이블에 별도로 저장X)

Materialized View 예시

  • Materialized View를 생성하기 전 Materialized View Log를 생성해줘야 함(FAST옵션 사용하고자 한다면)

  • Materialized View Log는 원본 데이터에서 변화가 생긴 ROW를 모니터링하고 Refresh가 되어야할 데이터의 Primary Key를 관리함.

① Materialized View Log 생성

CREATE MATERILAIZED VIEW LOG <DB테이블명>
 -- PRIMARY KEY : 데이터 식별 값을 로그에 포함
 -- SEQUENCE : 변경 사항이 발생할 때마다 순차 번호 부여
 -- ROWID : Oracle 데이터베이스에 특정 행(ROW)의 물리적 위치를 나타내는 고유 식별자
WITH PRIMARY KEY, ROWID, SEQUNECE
 -- INCLUDING NEW VALUES : 갱신된 데이터를 저장(새로운 값 저장됨)
 -- INCLUDING NEW VALUES 생략된 경우, LOG에는 보통 ROWID와 PRIMARY KEY등만 저장되어 신규 값을 원본 테이블에서 조회해야 함.
INCLUDING NEW VALUES; -- FAST의 경우 필수 (새로운 값이 입력될 때 제대로 작동을 못하기 때문)

② Materialized View 생성

CREATE MATERIALIZED VIEW MY_MVIEW_TABLE
[BUILD IMMEDIATE] or [BUILD DEFERRED]
REFRESH
[FORCE] or [COMPLETE] or [FAST] or [NEVER]
[ON DEMAND] or [ON COMMIT]
ENABLE QUERY REWRITE
AS [SELECT 쿼리문]
  • BUILD IMMEDIATE : MView 생성과 동시에 데이터들이 생성

  • BUILD DEFERRED : MView 생성은 하지만, 추후에 데이터들이 생성(최초 조회시 생성)

  • REFRESH : MView 데이터가 언제 어떻게 Refresh 되는지 옵션

    • REFRESH 설정 옵션 1

      • FORCE : FAST REFRESH가 가능하면 적용하고, 그렇지 않으면 COMPLETE

      • FAST : 데이터가 입력/변경될 때마다 점진적으로 Refresh (MView Log사용)

      • COMPLETE : 데이터 전체가 Refresh (MView Log 사용X)

      • NEVER : Refresh가 발생하지 않음

    • REFRESH 설정 옵션 2

      • ON COMMIT : 원본 테이블에 COMMIT이 일어날 때 Refresh

      • ON DEMAND : 사용자가 Refresh를 실행한 경우에만 Refresh

    • ENABLE QUERY REWRITE : 옵티마이저가 SQL문을 실행할 때 MView를 쿼리 재작성 대상으로 포함(성능 최적화)

    • DISABLE QUERY REWRITE : 옵티마이저가 SQL문 실행할 때 MView를 사용하지 않음

FAST & INCLUDING NEW VALUES 옵션 처리 프로세스

  • REFRESH FAST ON DEMAND & INCLUDING NEW VALUES의 경우

    3512
  • REFRESH FAST ON COMMIT & INCLUDING NEW VALUES 의 경우

    3511
  • 기존 데이터가 변경되는 경우 : 기존 값과 변경 값 두개를 저장하여 찾고 Log에 ROW 2개가 쌓임

  • 신규 데이터가 추가되는 경우 : 기존 데이터가 없으므Log에 ROW가 1개 쌓임

  • INCLUDING NEW VALUES 설정을 안하면 FAST의 경우 새로운 값은 Log에 쌓이질 않으니 제대로 동작할 수가 없음. (FAST와 INCLUDING NEW VALUES는 세트)

Materialized View 장점 & 단점

○ 장점

  • 빠른 조회 : 미리 계산된 데이터를 저장하여 조회 속도 빠름

  • 복잡한 쿼리 최적화 : 조인 집계 등이 포함된 복잡한 쿼리 실행 부담 감소

  • 네트워크 부하 감소 : 원격 DB 데이터를 로컬에 저장하여 트래픽 절감

  • 백업 및 보고서 활용 : 주기적으로 갱신하여 데이터 분석 및 보고서 생성에 유리

○ 단점

  • 데이터 갱신 필요 : 원본 데이터 변경 시 새로 갱신해야 함. (ON COMMIT 미적용시)

  • 추가된 저장공간 필요 : 데이터 조회결과를 물리적으로 저장하기 때문에 디스크 공간 소모

  • 갱신 비용 증가 : 실시간 데이터 변경이 많으면 성능 저하 발생

  • 복잡한 유지 보수 : 자동 갱신 설정 시 성능 튜닝 필요. (성능 튜닝X - > 과부화)

    • 예시

        -- 1.
        CREATE MATERIALIZED VIEW MV_CTEST1  
        REFRESH FAST ON COMMIT -- 원본 테이블이 변경될때(커밋될 떄) 마다 변경된 데이터만 
        AS  
        SELECT * FROM X_MV_TABLE_TEST;
        
        -- 2.
        CREATE MATERIALIZED VIEW MV_CTEST2  
        REFRESH COMPLETE  --  데이터 전체 갱신
        START WITH SYSDATE  
        NEXT TRUNC(SYSDATE + 1) + 6/24  -- 새벽 6시 마다
        AS  
        SELECT * FROM X_MV_TABLE_TEST;
  • 제한된 쿼리 : MView 생성 시 일부 복잡한 SQL 구문은 지원X

    • 밑의 표 외에도 지원여부에 따라 추가된 내용이 더 있을 수 있음

Refresh 방식

지원 O

지원 X

ON COMMIT

- 단순 쿼리: 기본적인 SELECT 쿼리 (변경된 데이터만 갱신)
- Primary KeyROWID 기반의 변경 추적

- 조인 (JOIN): 복잡한 다중 테이블 조인
- 서브쿼리 (Subquery): 서브쿼리를 사용하는 쿼리
- 복잡한 집계 (GROUP BY, HAVING): 집계 함수나 그룹핑 쿼리
- DISTINCT: 중복 제거를 위한 DISTINCT 사용 쿼리
- Lob 데이터 (BLOB, CLOB 등): LOB 타입 데이터 사용 쿼리
- 도메인 인덱스 (예: SDO_GEOMETRY 등): 도메인 인덱스를 사용하는 컬럼

FAST

- 단순 쿼리: MView Log에 의한 빠른 갱신 (변경된 데이터만 갱신)
- Primary KeyROWID 기반의 빠른 리프레시
- 적절한 MView Log 설정: 로그 테이블을 통해 변경된 데이터 추적

- 복잡한 쿼리: JOIN, GROUP BY, UNION, HAVING, DISTINCT 등 복잡한 연산이 포함된 쿼리
- 서브쿼리 (Subquery): 서브쿼리를 사용하는 쿼리
- 도메인 인덱스: 도메인 인덱스가 포함된 컬럼 (예: SDO_GEOMETRY)
- Lob 데이터 (BLOB, CLOB 등): LOB 데이터 포함 시 갱신 불가
- 복잡한 집계: ROLLUP, CUBE 같은 집계 함수를 사용한 쿼리

COMPLETE

- 모든 쿼리: 복잡한 쿼리도 가능 (예: JOIN, GROUP BY, UNION, 집계 함수 등)
- 변경된 모든 데이터를 완전 새로 갱신
- 대용량 테이블에서도 사용 가능
- 복잡한 계산이 포함된 쿼리도 처리 가능

- 성능 저하: 전체 데이터를 새로 갱신하므로 대규모 테이블에 대해서는 시간이 오래 걸릴 수 있음
- 리프레시 속도: 대규모 데이터를 처리하는 동안 리프레시 시간이 길어질 수 있음
- WITH 절: 공통 테이블 표현식(CTE)을 포함한 복잡한 쿼리는 성능에 부정적인 영향을 미칠 수 있음

" Q. FAST 옵션을 사용할 떄 JOIN이 안된다. 이유는?"

  • INNER JOIN

    35153516
  • OUTER JOIN

    3513






- 컬렉션 아티클