다음을 통해 공유


CREATE MATERIALIZED VIEW

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

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

수동 refresh수행하는 방법에 대한 자세한 내용은 REFRESH(MATERIALIZED VIEW 또는 STREAMING TABLE)참조하세요.

refresh예약하는 방법에 대한 자세한 내용은 예제 또는 ALTER MATERIALIZED VIEW참조하세요.

참고 항목

구체화된 views 및 스트리밍 tables에 대한 생성 및 refresh 작업은 서버리스 Delta Live Tables 파이프라인에 의해 구동됩니다. Catalog 탐색기를 사용하여 UI의 지원 파이프라인에 대한 세부 정보를 볼 수 있습니다. 무엇이 Catalog 탐색기입니까?을 참조하세요.

구문

{ 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 ] }

Parameters

  • REPLACE

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

  • IF NOT EXISTS

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

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

  • view_name

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

  • column_list

    필요에 따라 뷰의 쿼리 결과에 columns 레이블을 지정합니다. column list를 제공하는 경우, column 별칭의 수는 쿼리의 식 수와 일치해야 합니다. column list 지정하지 않으면 별칭이 뷰 본문에서 파생됩니다.

    • column_name

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

    • column_type

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

    • column_comment

      선택적 STRING 리터럴로 column을 설명합니다. 이 옵션은 column_type과 함께 지정해야 합니다. column 형식을 지정하지 않으면 column 주석을 건너뜁니다.

    • column_constraint

      구체화된 뷰의 column에 정보 기본 키 constraint을(를) 추가하거나 정보 외래 키를 추가합니다. column 형식이 지정되지 않으면 columnconstraint가 건너뛰어집니다.

    • MASK 절

      Important

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

      column 마스크 함수를 추가하여 중요한 데이터를 익명화합니다. 해당 column의 모든 후속 쿼리는 column의 원래 값 대신, column에 대해 해당 함수를 평가하여 얻은 결과를 받습니다. 이는 함수가 호출하는 사용자의 ID 또는 그룹 멤버 자격을 검사하여 값을 수정할지 여부를 확인할 수 where 세분화된 액세스 제어 용도에 유용할 수 있습니다. column 형식이 지정되지 않으면 column 마스크를 제외합니다.

  • table_constraint

    구체화된 뷰 table에 정보용 기본 키 또는 정보용 외래 키 constraint를 추가합니다. column 형식을 지정하지 않으면 tableconstraint를 건너뜁니다.

  • view_clauses

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

    • PARTITIONED BY

      table의 columns의 선택적 list을(를) partitiontable으로/로.

    • COMMENT view_comment

      table을 설명하는 STRING 리터럴입니다.

    • TBLPROPERTIES

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

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

    • 일정 [ REFRESH ] 일정_규정

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

        refresh가 주기적으로 발생하도록 예약하려면 EVERY 구문을 사용합니다. EVERY 구문을 지정하면 스트리밍 table 또는 구체화된 뷰는 제공된 값(예: HOUR, HOURS, DAY, DAYS, WEEK또는 WEEKS)에 따라 지정된 간격으로 주기적으로 새로 고쳐집니다. 다음의 table는 number에 허용되는 정수 values을 나열합니다.

        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 ]

        refresh을 예약하기 위해 quartz cron 값을 사용합니다. 유효한 time_zone_values 허용됩니다. AT TIME ZONE LOCAL은 지원되지 않습니다.

        AT TIME ZONE이 없는 경우 세션 표준 시간대가 사용됩니다. AT TIME ZONE이 없고 세션 표준 시간대가 set이 아니면 오류가 발생합니다. SCHEDULESCHEDULE REFRESH와 의미 체계가 같습니다.

    • ROW FILTER 절

      Important

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

      table에 행 필터 기능을 추가합니다. 모든 후속 쿼리는 해당 table에서 함수가 부울 TRUE로 평가되는 행의 하위 집합을 받습니다. 이는 함수가 호출하는 사용자의 ID 또는 그룹 멤버 자격을 검사하여 특정 행을 필터링할지 여부를 결정할 수 where 세분화된 액세스 제어 용도에 유용할 수 있습니다.

  • AS query

    기본 tables이나 다른 views에서 뷰를 생성하는 쿼리입니다.

필요한 사용 권한

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

  • MV에서 참조하는 기본 tables에 대한 SELECT의 권한입니다.
  • 부모 catalog에 대한 USE CATALOG 권한 및 부모 schema에 대한 USE SCHEMA 권한.
  • MV에 대한 CREATE MATERIALIZED VIEW 권한을 schema에서 부여 받았습니다.

사용자가 MV를 refresh할 수 있으려면 다음이 필요합니다.

  • 부모 catalog에 대한 USE CATALOG 권한 및 부모 schema에 대한 USE SCHEMA 권한.
  • MV의 소유권 또는 REFRESH MV에 대한 권한.
  • MV의 소유자는 MV가 참조하는 기본 tables에 대해 SELECT 권한을 가지고 있어야 합니다.

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

  • 부모 catalog에 대한 USE CATALOG 권한 및 부모 schema에 대한 USE SCHEMA 권한.
  • 구체화된 뷰에 대한 SELECT 권한.

행 필터 및 column 마스크

Important

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

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

Column 마스크를 사용하면 table 검사가 행을 가져올 때마다 column의 values를 마스크할 수 있습니다. 해당 column와 관련된 모든 향후 쿼리는 column에 대한 함수를 평가한 결과를 받아서, column의 원래 값을 대체하게 됩니다.

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

행 필터 및 Column 마스크 관리

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

동작

  • 정의자로서의 Refresh: REFRESH MATERIALIZED VIEW 문이 구체화된 뷰를 새로 고칠 때, 행 필터 함수는 정의자(table 소유자)의 권한으로 실행됩니다. 즉, tablerefresh 구체화된 뷰를 만든 사용자의 보안 컨텍스트를 사용합니다.
  • 쿼리: 대부분의 필터는 정의자의 권한으로 실행되지만 사용자 컨텍스트(예: CURRENT_USERIS_MEMBER)를 확인하는 함수는 예외입니다. 이러한 함수는 호출자로 실행됩니다. 이 방법은 현재 사용자의 컨텍스트에 따라 사용자별 데이터 보안 및 액세스 제어를 적용합니다.
  • 행 필터 및 column 마스크가 포함된 원본 tables에 대해 구체화된 views을 만들 때, 구체화된 뷰의 refresh은 항상 전체 refresh이다. 소스에서 사용할 수 있는 모든 데이터를 최신 정의를 사용하여 완전한 refresh로 다시 처리합니다. 이렇게 하면 원본 tables 보안 정책이 가장 up-to-date 데이터 및 정의로 평가되고 적용됩니다.

가시성

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

제한 사항

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

예제

-- 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 every day.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE EVERY 1 DAY
  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;