다음을 통해 공유


CREATE MATERIALIZED VIEW

적용 대상:예로 표시된 확인 Databricks SQL

구체화된 뷰는 미리 계산된 결과를 쿼리에 사용할 수 있고 입력의 변경 내용을 반영하도록 업데이트할 수 있는 보기입니다. 구체화된 뷰를 새로 고칠 때마다 업스트림 데이터 세트의 변경 내용을 반영하도록 쿼리 결과가 다시 계산됩니다. 모든 구체화된 뷰는 DLT 파이프라인에서 지원됩니다. 구체화된 뷰를 수동으로 또는 일정에 따라 새로 고칠 수 있습니다.

수동 새로 고침을 수행하는 방법에 대한 자세한 내용은 REFRESH(MATERIALIZED VIEW 또는 STREAMING TABLE)를 참조하세요.

새로 고침을 예약하는 방법에 대한 자세한 내용은 예제 또는 ALTER MATERIALIZED VIEW를 참조하세요.

참고 항목

구체화된 뷰 및 스트리밍 테이블에 대한 만들기와 새로 고침 작업은 서버리스 Delta Live Tables 파이프라인을 통해 제공됩니다. 카탈로그 탐색기를 사용하여 UI에서 지원 파이프라인에 대한 세부 정보를 볼 수 있습니다. 카탈로그 탐색기란?을 참조하세요.

구문

{ CREATE OR REPLACE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] }
  view_name
  [ column_list ]
  [ view_clauses ]
  [schedule_clause]
  AS query

column_list
   ( { column_name column_type column_properties } [, ...]
      [ , table_constraint ] [...])

   column_properties
      { NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]

view_clauses
  { PARTITIONED BY (col [, ...]) |
    COMMENT view_comment |
    TBLPROPERTIES clause |
    SCHEDULE [ REFRESH ] schedule_clause |
    WITH { ROW FILTER clause } } [...]

schedule_clause
  { EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS } |
    CRON cron_string [ AT TIME ZONE timezone_id ] }

매개 변수

  • REPLACE

    지정되면 보기와 해당 내용이 이미 있는 경우 이를 바꿉니다.

  • IF NOT EXISTS

    없는 경우 보기를 만듭니다. 이 이름의 보기가 이미 있는 경우 CREATE MATERIALIZED VIEW 문은 무시됩니다.

    IF NOT EXISTS 또는 OR REPLACE 중 최대 하나를 지정할 수 있습니다.

  • view_name

    새로 만들어진 뷰의 이름입니다. 정규화된 뷰 이름은 고유해야 합니다.

  • column_list

    선택적으로 뷰의 쿼리 결과에서 열에 레이블을 지정합니다. 열 목록을 제공하는 경우 열 별칭의 수는 쿼리의 식 수와 일치해야 합니다. 열 목록이 지정되지 않은 경우 별칭은 보기의 본문에서 파생됩니다.

    • column_name

      열 이름은 고유해야 하며 쿼리의 출력 열에 매핑되어야 합니다.

    • column_type

      열 데이터 형식을 지정합니다. Azure Databricks에서 지원되는 모든 데이터 형식이 구체화된 뷰에서 지원되는 것은 아닙니다.

    • column_comment

      열을 설명하는 선택 가능한 STRING 리터럴입니다. 이 옵션은 column_type과 함께 지정해야 합니다. 열 형식을 지정하지 않으면 열 설명을 건너뜁니다.

    • column_constraint

      구체화된 뷰의 열에 정보 기본 키 또는 정보 외래 키 제약 조건을 추가합니다. 열 형식을 지정하지 않으면 제약 조건을 건너뜁니다.

    • MASK 절

      Important

      이 기능은 공개 미리 보기 상태입니다.

      열 마스크 함수를 추가하여 중요한 데이터를 익명화합니다. 해당 열의 모든 후속 쿼리는 열의 원래 값 대신 열에 대해 해당 함수를 평가한 결과를 받게 됩니다. 이는 함수가 값을 수정할지 여부를 결정하기 위해 호출하는 사용자의 ID 및/또는 그룹 구성원을 검사할 수 있는 세분화된 액세스 제어 목적에 유용할 수 있습니다. 열 형식을 지정하지 않으면 열 마스크를 건너뜁니다.

  • table_constraint

    구체화된 뷰의 테이블에 정보 기본 키 또는 정보 외래 키 제약 조건을 추가합니다. 열 형식을 지정하지 않으면 테이블 제약 조건을 건너뜁니다.

  • view_clauses

    필요에 따라 분할, 설명, 사용자 정의 속성 및 새 구체화된 뷰에 대한 새로 고침 일정을 지정합니다. 각 하위 절은 한 번만 지정할 수 있습니다.

    • PARTITIONED BY

      테이블을 분할할 테이블의 열에 대한 선택적 목록입니다.

    • COMMENT view_comment

      테이블을 설명하는 STRING 리터럴입니다.

    • TBLPROPERTIES

      선택적으로 하나 이상의 사용자 정의 속성을 설정합니다.

      이 설정을 사용하여 이 문을 실행하는 데 사용되는 Delta Live Tables 런타임 채널을 지정합니다. 속성 pipelines.channel 의 값을 "PREVIEW"0>"CURRENT"로 설정합니다. 기본값은 "CURRENT"입니다. Delta Live Tables 채널에 대한 자세한 내용은 Delta Live Tables 런타임 채널을 참조 하세요.

    • 일정 [ 새로 고침 ] schedule_clause

      • EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS }

        Important

        이 기능은 공개 미리 보기 상태입니다.

        주기적으로 발생하는 새로 고침을 예약하려면 구문을 사용합니다 EVERY . 구문을 지정하면 EVERY 스트리밍 테이블 또는 구체화된 뷰는 제공된 값(예: HOUR, , HOURSDAYDAYSWEEK, 또는 WEEKS)에 따라 지정된 간격으로 주기적으로 새로 고쳐집니다. 다음 표에서는 에 허용되는 정수 값을 나열합니다 number.

        Time unit 정수 값
        HOUR or HOURS 1 <= H <= 72
        DAY or DAYS 1 <= D <= 31
        WEEK or WEEKS 1 <= W <= 8

        참고 항목

        포함된 시간 단위의 단수 및 복수 형태는 의미상 동일합니다.

      • CRON cron_string [ AT TIME ZONE timezone_id ]

        석영 cron 값을 사용하여 새로 고침을 예약하려면 유효한 time_zone_values 허용됩니다. AT TIME ZONE LOCAL은 지원되지 않습니다.

        AT TIME ZONE이 없는 경우 세션 표준 시간대가 사용됩니다. AT TIME ZONE이 없고 세션 표준 시간대가 설정되어 있지 않은 경우 오류가 throw됩니다. SCHEDULESCHEDULE REFRESH와 의미 체계가 같습니다.

    • 행 필터 절 사용

      Important

      이 기능은 공개 미리 보기 상태입니다.

      테이블에 행 필터 함수를 추가합니다. 해당 테이블의 모든 후속 쿼리는 함수가 부울 TRUE로 평가되는 행의 하위 집합을 수신합니다. 이는 함수가 특정 행을 필터링할지 여부를 결정하기 위해 호출하는 사용자의 ID 및/또는 그룹 구성원을 검사할 수 있는 세분화된 액세스 제어 목적에 유용할 수 있습니다.

  • AS query

    기본 테이블 또는 다른 뷰에서 뷰를 생성하는 쿼리입니다.

필요한 사용 권한

MV(구체화된 뷰)를 만드는 사용자는 MV 소유자이며 다음 권한이 있어야 합니다.

  • MV에서 참조하는 기본 테이블에 대한 SELECT 권한.
  • 부모 카탈로그에 대한 USE CATALOG 권한 및 부모 스키마에 대한 USE SCHEMA 권한.
  • MV의 스키마에 대한 CREATE MATERIALIZED VIEW 권한.

사용자가 MV를 새로 고칠 수 있도록 하려면 다음이 필요합니다.

  • 부모 카탈로그에 대한 USE CATALOG 권한 및 부모 스키마에 대한 USE SCHEMA 권한.
  • MV의 소유권 또는 REFRESH MV에 대한 권한.
  • MV의 소유자는 MV에서 참조하는 기본 테이블에 대한 SELECT 권한이 있어야 합니다.

사용자가 MV를 쿼리할 수 있도록 하려면 다음이 필요합니다.

  • 부모 카탈로그에 대한 USE CATALOG 권한 및 부모 스키마에 대한 USE SCHEMA 권한.
  • 구체화된 뷰에 대한 SELECT 권한.

행 필터 및 열 마스크

Important

이 기능은 공개 미리 보기 상태입니다.

행 필터를 사용하면 테이블 검색이 행을 가져올 때마다 필터로 적용되는 함수를 지정할 수 있습니다. 이러한 필터를 통해 후속 쿼리는 필터 조건자가 true로 평가되는 행만 반환합니다.

열 마스크를 사용하면 테이블 검색이 행을 가져올 때마다 열 값을 마스킹할 수 있습니다. 해당 열의 모든 향후 쿼리는 열의 원래 값 대신 열에 대해 해당 함수를 평가한 결과를 수신하게 됩니다.

행 필터 및 열 마스크를 사용하는 방법에 대한 자세한 내용은 행 필터 및 열 마스크를 사용하여 중요한 테이블 데이터 필터링을 참조하세요.

행 필터 및 열 마스크 관리

구체화된 뷰의 행 필터 및 열 마스크는 CREATE 문을 통해 추가해야 합니다.

동작

  • 정의자로 새로 고침: REFRESH MATERIALIZED VIEW 문이 구체화된 뷰를 새로 고치면 행 필터 함수는 정의자의 권한(테이블 소유자)으로 실행됩니다. 즉, 테이블 새로 고침은 구체화된 뷰를 만든 사용자의 보안 컨텍스트를 사용합니다.
  • 쿼리: 대부분의 필터는 정의자의 권한으로 실행되지만 사용자 컨텍스트(예: CURRENT_USERIS_MEMBER)를 확인하는 함수는 예외입니다. 이러한 함수는 호출자로 실행됩니다. 이 방법은 현재 사용자의 컨텍스트에 따라 사용자별 데이터 보안 및 액세스 제어를 적용합니다.
  • 행 필터 및 열 마스크가 포함된 원본 테이블에 대해 구체화된 뷰를 만들 때 구체화된 뷰의 새로 고침은 항상 전체 새로 고침입니다. 전체 새로 고침은 원본에서 사용 가능한 모든 데이터를 최신 정의로 다시 처리합니다. 이를 통해 원본 테이블의 보안 정책이 최신 데이터 및 정의로 평가되고 적용됩니다.

가시성

DESCRIBE EXTENDED, INFORMATION_SCHEMA 또는 카탈로그 탐색기를 사용하여 지정된 구체화된 뷰에 적용되는 기존 행 필터 및 열 마스크를 검사합니다. 이 기능을 사용하면 사용자가 구체화된 뷰에 대한 데이터 액세스 및 보호 조치를 감사하고 검토할 수 있습니다.

제한 사항

  • NULL 가능 열에 대한 sum 집계가 있는 구체화된 뷰에 해당 열에서 NULL이 아닌 마지막 값이 제거되어 NULL 값만 해당 열에 남아 있는 경우 구체화된 뷰의 결과 집계 값은 NULL 대신 0을 반환합니다.
  • 열 참조에는 별칭이 필요하지 않습니다. 다음 예제와 같이 열이 아닌 참조 식에는 별칭이 필요합니다.
    • 허용됨: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 허용되지 않음: SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 유효한 문이 되려면 NOT NULLPRIMARY KEY와 함께 수동으로 지정해야 합니다.
  • 구체화된 뷰는 ID 열 또는 서로게이트 키를 지원하지 않습니다.
  • 구체화된 뷰는 OPTIMIZEVACUUM 명령을 지원하지 않습니다. 유지 관리는 자동으로 수행됩니다.
  • 구체화된 뷰는 데이터 품질 제약 조건을 정의하는 기대치를 지원하지 않습니다.

예제

-- Create a materialized view if it doesn't exist
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create and schedule a materialized view to be refreshed daily at midnight.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE CRON '0 0 0 * * ? *'
  AS SELECT date AS date, sum(sales) AS sumOfSales
       FROM table1
       GROUP BY date;

-- Sets the runtime channel to "PREVIEW"
> CREATE MATERIALIZED VIEW mv_preview
  TBLPROPERTIES(pipelines.channel = "PREVIEW")
  AS SELECT * FROM RANGE(10)

-- Create a materialized view with a table constraint
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
    member_id int NOT NULL,
    full_name string,
    movie_title string,
    CONSTRAINT movie_pk PRIMARY KEY(member_id)
  )
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create or replace the materialized view to remove the table constraint and add a partition
> CREATE OR REPLACE MATERIALIZED VIEW subscribed_movies
  PARTITIONED BY (member_id)
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create a materialized view with a row filter and a column mask
> CREATE MATERIALIZED VIEW masked_view (
    id int,
    name string,
    region string,
    ssn string MASK catalog.schema.ssn_mask_fn
  )
  WITH ROW FILTER catalog.schema.us_filter_fn ON (region)
  AS SELECT id, name, region, ssn
       FROM employees;