Materialized View

이도형·2025년 11월 16일

Materialized View의 개념

핵심 개념

Materialized View는 구체화된 뷰라는 의미를 가지고 있습니다.

데이터베이스에서 쿼리 결과를 미리 계산하여 실제 테이블 형태로 저장합니다.

특징

  • 쿼리 결과를 물리적으로 저장하여, 기존 View와 달리 빠른 조회가 가능하도록 함
  • 주로 데이터 웨어하우스 환경에서 사용
  • 집계함수 (min, max, sum, avg ...) 주기적으로 미리 계산해놓을 때 효과적
  • 일정 주기 또는 수동으로 Refresh가 필요 (원본 테이블 데이터 변경 시 갱신되지 않음)

리프레시 방식

  • COMPLETE Refresh : 기존 데이터 모두 삭제 후 전량 재 갱신
  • FAST Refresh : 원본 테이블에 변경된 부분만 변경, Materialized View 로그 활용
  • FORCE Refresh : FAST Refresh 실행 후 불가능한 경우 COMPLETE Refresh 수행
  • NEVER Refresh : Refresh를 수동으로만 수행

리프레시 시점에 따른 옵션

  • ON COMMIT :
    원본 테이블에 트랜잭션 커밋 발생 시 자동으로 Materialized View 갱신
    데이터 정합성 실시간 가깝게 유지
    성능 부담이 크므로 주로 소규모 데이터에 적합

  • ON DEMAND :
    Refresh를 수동으로 수행
    대량 데이터일 때 사용

활용 방법

  1. 대용량 집계 테이블 조회
  2. DW(데이터웨어하우스), BI 환경에서 주기적요약 데이터 생성 및 빠른 통꼐 제공
  3. 실시간 집계가 필요 없는 일별/월별 통계 데이터 구축

Materialized View 활용

구문

CREATE [ OR REPLACE ] [ SECURE ] MATERIALIZED VIEW [ IF NOT EXISTS ] <name>
  [ COPY GRANTS ]
  ( <column_list> )
  [ <col1> [ WITH ] MASKING POLICY <policy_name> [ USING ( <col1> , <cond_col1> , ... ) ]
           [ WITH ] PROJECTION POLICY <policy_name>
           [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ , <col2> [ ... ] ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
  [ CLUSTER BY ( <expr1> [, <expr2> ... ] ) ]
  AS <select_statement>

출처 : https://docs.snowflake.com/ko/sql-reference/sql/create-materialized-view

이 중 중요한 것을 간추려 보자면

CREATE MATERIALIZED VIEW view_name
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT column1, column2
FROM source_table
WHERE condition;

이는 Oracle과 PostgreSQL 등에서 사용 가능한 기본 형태입니다.

결론

Materialized View는 실시간 갱신이 빈번한 데이터에서 사용하기는 곤란하지만,
통계 혹은 BI적인 관점에서 데이터를 다룰 때 필요하다💡

profile
열심히 살고 싶습니다! 일하고 싶습니다 :)

0개의 댓글