CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW

현재/지정한 스키마에 기존 테이블의 쿼리를 기반으로 새 구체화된 뷰(materialized view)를 만들고 뷰에 데이터를 채우는 명령이에요. 구체화된 뷰는 쿼리 결과를 미리 계산·저장해 반복 쿼리 성능을 높여요.

출처: 문서

본문

현재/지정한 스키마에 기존 테이블의 쿼리를 기반으로 새 구체화된 뷰를 만들고 뷰에 데이터를 채워요.

자세한 내용은 구체화된 뷰 작업(Working with Materialized Views)을 참고해요.

함께 보기: ALTER MATERIALIZED VIEW, DROP MATERIALIZED VIEW, SHOW MATERIALIZED VIEWS, DESCRIBE MATERIALIZED VIEW

구문 (Syntax)

CREATE [ OR REPLACE ] [ SECURE ] [ INTERACTIVE ] 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> ... ] ) ] ]
  [ CLUSTER BY ( <expr1> [, <expr2> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
  AS <select_statement>

필수 매개변수 (Required parameters)

name 뷰의 식별자를 지정하며, 뷰가 만들어지는 스키마 안에서 고유해야 해요.

또한 식별자는 반드시 알파벳 문자로 시작해야 하며, 전체 식별자 문자열이 큰따옴표로 묶이지 않는 한 공백이나 특수 문자를 포함할 수 없어요 (예: "My object"). 큰따옴표로 묶인 식별자는 대소문자를 구분해요.

자세한 내용은 식별자 요구 사항(Identifier requirements)을 참고해요.

select_statement 뷰를 만드는 데 사용되는 쿼리를 지정해요. 이 쿼리는 뷰의 텍스트/정의 역할을 해요. 이 쿼리는 SHOW VIEWS와 SHOW MATERIALIZED VIEWS 출력에 표시돼요.

select_statement에는 제한이 있어요. 자세한 내용은 사용 메모(Usage notes)와 구체화된 뷰 생성 제한(Limitations on Creating Materialized Views)을 참고해요.

선택 매개변수 (Optional parameters)

column_list 뷰의 컬럼 이름이 기본 테이블의 컬럼 이름과 같지 않기를 원한다면, 컬럼 이름을 지정하는 컬럼 목록을 포함할 수 있어요. (컬럼의 데이터 유형은 지정할 필요가 없어요.)

구체화된 뷰에 CLUSTER BY 절을 포함한다면 컬럼 이름 목록을 반드시 포함해야 해요.

MASKING POLICY = policy_name 컬럼에 설정할 마스킹 정책(masking policy)을 지정해요.

USING ( col_name , cond_col_1 ... ) 조건부 마스킹 정책 SQL 표현식에 전달할 인자를 지정해요.

목록의 첫 번째 컬럼은 데이터를 마스킹하거나 토큰화할 정책 조건의 컬럼을 지정하며, 마스킹 정책이 설정된 컬럼과 일치해야 해요.

추가 컬럼은 첫 번째 컬럼에 대한 쿼리가 이루어질 때 쿼리 결과의 각 행에서 데이터를 마스킹할지 토큰화할지 결정하기 위해 평가할 컬럼을 지정해요.

USING 절을 생략하면 Snowflake는 조건부 마스킹 정책을 일반 마스킹 정책으로 취급해요.

PROJECTION POLICY policy_name 컬럼에 설정할 프로젝션 정책(projection policy)을 지정해요.

string_literal 뷰에 대한 설명(comment)을 지정해요. 문자열 리터럴은 작은따옴표 안에 있어야 해요. (문자열 리터럴은 이스케이프되지 않는 한 작은따옴표를 포함하지 않아야 해요.)

  • 기본값: 값 없음

INTERACTIVE 인터랙티브 테이블의 저지연 쿼리에 최적화된 인터랙티브 구체화된 뷰를 만들어요. 인터랙티브 구체화된 뷰는 단일 인터랙티브 테이블을 기반으로 해야 해요. 인터랙티브 구체화된 뷰를 만든 뒤에는 구체화된 뷰와 그것의 기본 베이스 테이블을 모두 인터랙티브 웨어하우스에 추가해야 해요.

자세한 내용은 인터랙티브 테이블의 구체화된 뷰 지원(Materialized view support for interactive tables)을 참고해요.

  • 기본값: 값 없음 (표준 구체화된 뷰 생성)

SECURE 뷰가 보안(secure) 뷰임을 지정해요. 보안 뷰에 대한 자세한 내용은 보안 뷰 작업(Working with Secure Views)을 참고해요.

  • 기본값: 값 없음 (뷰가 보안이 아님)

COPY GRANTS OR REPLACE 절로 기존 뷰를 교체하고 있다면, 교체 뷰가 원래 뷰의 접근 권한을 유지해요. 이 매개변수는 OWNERSHIP을 제외한 모든 권한을 기존 뷰에서 새 뷰로 복사해요. 새 뷰는 스키마의 객체 유형에 정의된 미래 권한 부여(future grants)를 상속하지 않아요. 기본적으로 CREATE MATERIALIZED VIEW 문을 실행하는 역할이 새 뷰를 소유해요.

CREATE VIEW 문에 이 매개변수를 포함하지 않으면 새 뷰는 원래 뷰에 부여된 명시적 접근 권한을 상속하지 않지만, 스키마의 객체 유형에 정의된 미래 권한 부여는 상속해요.

권한 복사 작업은 CREATE VIEW 문과 함께 원자적으로(즉 같은 트랜잭션 안에서) 발생한다는 점에 주의해요.

  • 기본값: 값 없음 (권한이 복사되지 않음)

ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] ) 구체화된 뷰에 설정할 행 접근 정책(row access policy)을 지정해요.

AGGREGATION POLICY policy_name 구체화된 뷰에 설정할 집계 정책(aggregation policy)을 지정해요.

expr# 구체화된 뷰를 클러스터링할 표현식을 지정해요. 일반적으로 각 표현식은 구체화된 뷰의 컬럼 이름이에요.

구체화된 뷰 클러스터링에 대한 자세한 내용은 구체화된 뷰와 클러스터링(Materialized Views and Clustering)을 참고해요. 일반적인 클러스터링에 대한 자세한 내용은 데이터 클러스터링이란?(What is Data Clustering?)을 참고해요.

WITH DATA METRIC FUNCTION ( dmf_name ON ( col_name [ , col_name ... ] ) [ , dmf_binding ... ] ) 생성 시점에 구체화된 뷰와 하나 이상의 DMF(데이터 메트릭 함수)를 연결해요. DMF는 생성되는 즉시 구체화된 뷰에 대해 구성된 스케줄로 실행되기 시작해요.

여러 DMF 바인딩을 쉼표로 구분해 연결할 수 있어요. 각 바인딩은 ALTER TABLE … ADD DATA METRIC FUNCTION과 같은 속성을 받아들이며, EXECUTE AS ROLE, ANOMALY_DETECTION, SENSITIVITY, DATA_QUALITY_NOTIFICATION, EXPECTATION을 포함해요.

각 속성에 대한 설명은 데이터 메트릭 함수 작업(Data metric function actions)을 참고해요.

Snowflake는 바인딩 목록 주위의 괄호 없이도 이 절을 받아들이지만, 그 형식은 더 이상 사용되지 않으며 향후 동작 변경 릴리스에서 제거돼요.

사용 지침과 예시는 생성 시점에 DMF 연결(Attach DMFs at creation time)을 참고해요.

  • 기본값: 값 없음 (구체화된 뷰에 DMF가 연결되지 않음)

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) 태그 이름과 태그 문자열 값을 지정해요.

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256이에요.

문에서 태그를 지정하는 방법에 대한 정보는 태그 할당량(Tag quotas)을 참고해요.

WITH CONTACT ( purpose = contact [ , purpose = contact ...] ) 새 객체를 하나 이상의 연락처(contact)와 연결해요. 이 명령이 지원한다면 AS 절을 제외한 다른 모든 절 뒤에 WITH CONTACT 절을 지정해요.

사용 메모 (Usage notes)

구체화된 뷰를 만들려면 스키마에 대한 CREATE MATERIALIZED VIEW 권한과 기본 테이블에 대한 SELECT 권한이 필요해요. 권한과 구체화된 뷰에 대한 자세한 정보는 구체화된 뷰 스키마의 권한(Privileges on a Materialized View's Schema)을 참고해요.

뷰 정의에 CURRENT_DATABASE 또는 CURRENT_SCHEMA 함수를 지정하면, 이 함수는 뷰를 포함하는 데이터베이스 또는 스키마를 반환하며 세션에서 사용 중인 데이터베이스나 스키마를 반환하지 않아요.

구체화된 뷰의 이름을 선택할 때 스키마는 같은 이름의 테이블과 뷰를 포함할 수 없다는 점에 주의해요. CREATE [ MATERIALIZED ] VIEW는 스키마에 같은 이름의 테이블이 이미 있으면 오류를 만들어요.

select_statement를 지정할 때 다음 사항에 주의해요.

  • HAVING 절이나 ORDER BY 절을 지정할 수 없어요.
  • 구체화된 뷰에 CLUSTER BY 절을 포함하면 column_list 절을 포함해야 해요.
  • select_statement에서 기본 테이블을 두 번 이상 참조한다면 모든 참조에 같은 한정자(qualifier)를 사용해요.
    • 예를 들어 같은 select_statement에서 base_table, schema.base_table, database.schema.base_table을 혼합해 사용하지 마세요. 대신 이 형식 중 하나(예: database.schema.base_table)를 선택해 select_statement 전체에서 일관되게 사용해요.
  • SELECT 문에서 스트림 객체를 쿼리하지 마세요. 스트림은 뷰나 구체화된 뷰의 소스 객체 역할을 하도록 설계되지 않았어요.
  • 일부 컬럼 이름은 구체화된 뷰에서 허용되지 않아요. 컬럼 이름이 허용되지 않으면 컬럼에 별칭을 정의할 수 있어요. 자세한 내용은 구체화된 뷰에서 허용되지 않는 컬럼 이름 처리(Handling Column Names That Are Not Allowed in Materialized Views)를 참고해요.
  • 구체화된 뷰가 외부 테이블을 쿼리한다면, 참조된 클라우드 스토리지 위치의 변경(새 파일·업데이트된 파일·제거된 파일 포함)을 반영하도록 외부 테이블의 파일 수준 메타데이터를 새로 고쳐야 해요.
    • 클라우드 스토리지 서비스의 이벤트 알림 서비스로 외부 테이블의 메타데이터를 자동으로 새로 고치거나, ALTER EXTERNAL TABLE … REFRESH 문으로 수동으로 새로 고칠 수 있어요.

구체화된 뷰에는 그 외 많은 제한이 있어요. 자세한 내용은 구체화된 뷰 생성 제한(Limitations on Creating Materialized Views)과 구체화된 뷰 작업 제한(Limitations on Working With Materialized Views)을 참고해요.

인터랙티브 구체화된 뷰를 만들 때(INTERACTIVE 키워드 사용):

  • 구체화된 뷰는 단일 인터랙티브 테이블을 기반으로 해야 해요. 표준 테이블을 기반으로 인터랙티브 구체화된 뷰를 만들 수 없어요.
  • 표준 구체화된 뷰처럼 인터랙티브 구체화된 뷰에서도 조인은 지원되지 않아요.
  • 인터랙티브 구체화된 뷰를 만든 뒤에는 ALTER WAREHOUSE … ADD TABLES로 구체화된 뷰와 그것의 기본 베이스 테이블을 모두 인터랙티브 웨어하우스에 추가해야 해요.
  • 인터랙티브 구체화된 뷰를 다른 구체화된 뷰나 동적 테이블의 소스로 사용할 수 없어요.
  • 자세한 내용은 인터랙티브 테이블의 구체화된 뷰 지원을 참고해요.

기본 소스 테이블의 스키마가 변경되어 뷰 정의가 유효하지 않게 되면 뷰 정의는 업데이트되지 않아요. 예를 들어:

  • 베이스 테이블에서 뷰가 만들어졌고, 이후 그 베이스 테이블에서 컬럼이 삭제된 경우
  • 구체화된 뷰의 베이스 테이블이 삭제된 경우

이 시나리오에서 뷰를 쿼리하면 뷰가 무효화된 이유를 포함하는 오류가 반환돼요. 예를 들어:

Failure during expansion of view 'MV1':
  SQL compilation error: Materialized View MV1 is invalid.
  Invalidation reason: DDL Statement was executed on the base table 'MY_INVENTORY'.
  Marked Materialized View as invalid.

이런 일이 발생하면 다음을 할 수 있어요.

  • 베이스 테이블이 삭제되었고 Time Travel 데이터 보존 기간 안이라면, 베이스 테이블을 undrop해 구체화된 뷰를 다시 유효하게 만들 수 있어요.
  • CREATE OR REPLACE MATERIALIZED VIEW 명령으로 뷰를 다시 만들어요.

메타데이터에 관해서는 다음 사항에 주의해요.

⚠️ 주의: 고객은 Snowflake 서비스를 사용할 때 (User 객체를 제외하고) 개인 데이터·민감 데이터·수출 통제 데이터·기타 규제 데이터를 메타데이터로 입력하지 않도록 해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고해요.

OR REPLACE를 사용하는 것은 기존 구체화된 뷰에 DROP MATERIALIZED VIEW를 사용한 뒤 같은 이름으로 새 뷰를 만드는 것과 동일해요.

CREATE OR REPLACE <object> 문은 원자적(atomic)으로 동작해요. 즉, 객체를 교체할 때 기존 객체는 삭제되고 새 객체는 단일 트랜잭션 안에서 생성돼요.

이는 CREATE OR REPLACE MATERIALIZED VIEW 작업과 동시에 실행되는 모든 쿼리가 기존 버전 또는 새 버전의 구체화된 뷰를 사용한다는 의미예요.

OR REPLACEIF NOT EXISTS 절은 서로 배타적이에요. 같은 문에서 둘 다 사용할 수 없어요.

하나 이상의 구체화된 뷰 컬럼에 마스킹 정책이 있거나 구체화된 뷰에 행 접근 정책이 추가되어 있는 구체화된 뷰를 만들 때, POLICY_CONTEXT 함수를 사용해 마스킹 정책으로 보호되는 컬럼과 행 접근 정책으로 보호되는 구체화된 뷰에 대한 쿼리를 시뮬레이션해요.

예시 (Examples)

현재 스키마에 설명(comment)이 있는, 테이블에서 모든 행을 선택하는 구체화된 뷰를 만들어요.

CREATE MATERIALIZED VIEW mymv
    COMMENT='Test view'
    AS
    SELECT col1, col2 FROM mytable;

인터랙티브 테이블을 기반으로 인터랙티브 구체화된 뷰를 만든 뒤, 구체화된 뷰와 베이스 테이블을 모두 인터랙티브 웨어하우스에 추가해요.

CREATE INTERACTIVE MATERIALIZED VIEW IF NOT EXISTS mv_summary
    AS
    SELECT SUM(quantity) AS total_quantity, SUM(net_paid) AS total_net_paid
    FROM my_interactive_table
    WHERE call_center_id = 52;

ALTER WAREHOUSE interactive_wh ADD TABLES (mv_summary, my_interactive_table);

더 많은 예시는 구체화된 뷰 작업(Working with Materialized Views)의 예시를 참고해요.

더 알아보기 (Learn more)