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
중 최대 하나를 지정할 수 있습니다.-
새로 만들어진 뷰의 이름입니다. 정규화된 뷰 이름은 고유해야 합니다.
column_list
필요에 따라 뷰의 쿼리 결과에 columns 레이블을 지정합니다. column list를 제공하는 경우, column 별칭의 수는 쿼리의 식 수와 일치해야 합니다. column list 지정하지 않으면 별칭이 뷰 본문에서 파생됩니다.
-
column 이름은 고유해야 하며 쿼리의 출력인 columns에 매핑되어야 합니다.
column_type
column데이터 형식을 지정합니다. Azure Databricks에서 지원하는 모든 데이터 형식이 구체화된 views에서 지원되는 것은 아닙니다.
column_comment
선택적
STRING
리터럴로 column을 설명합니다. 이 옵션은column_type
과 함께 지정해야 합니다. column 형식을 지정하지 않으면 column 주석을 건너뜁니다.column_constraint
구체화된 뷰의 column에 정보 기본 키 constraint을(를) 추가하거나 정보 외래 키를 추가합니다. column 형식이 지정되지 않으면 columnconstraint가 건너뛰어집니다.
-
Important
이 기능은 공개 미리 보기 상태입니다.
column 마스크 함수를 추가하여 중요한 데이터를 익명화합니다. 해당 column의 모든 후속 쿼리는 column의 원래 값 대신, column에 대해 해당 함수를 평가하여 얻은 결과를 받습니다. 이는 함수가 호출하는 사용자의 ID 또는 그룹 멤버 자격을 검사하여 값을 수정할지 여부를 확인할 수 where 세분화된 액세스 제어 용도에 유용할 수 있습니다. column 형식이 지정되지 않으면 column 마스크를 제외합니다.
-
table_constraint
구체화된 뷰 table에 정보용 기본 키 또는 정보용 외래 키 constraint를 추가합니다. column 형식을 지정하지 않으면 tableconstraint를 건너뜁니다.
view_clauses
필요에 따라 분할, 주석, 사용자 정의 속성 및 구체화된 새 뷰에 대한 refresh 일정을 지정합니다. 각 하위 절은 한 번만 지정할 수 있습니다.
-
table의 columns의 선택적 list을(를) partitiontable으로/로.
COMMENT view_comment
table을 설명하는
STRING
리터럴입니다.-
선택적으로 하나 이상의 사용자 정의 속성을 설정합니다.
이 설정을 사용하여 이 문을 실행하는 데 사용되는 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이 아니면 오류가 발생합니다.SCHEDULE
은SCHEDULE REFRESH
와 의미 체계가 같습니다.
-
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_USER
및IS_MEMBER
)를 확인하는 함수는 예외입니다. 이러한 함수는 호출자로 실행됩니다. 이 방법은 현재 사용자의 컨텍스트에 따라 사용자별 데이터 보안 및 액세스 제어를 적용합니다. - 행 필터 및 column 마스크가 포함된 원본 tables에 대해 구체화된 views을 만들 때, 구체화된 뷰의 refresh은 항상 전체 refresh이다. 소스에서 사용할 수 있는 모든 데이터를 최신 정의를 사용하여 완전한 refresh로 다시 처리합니다. 이렇게 하면 원본 tables 보안 정책이 가장 up-to-date 데이터 및 정의로 평가되고 적용됩니다.
가시성
DESCRIBE EXTENDED
, INFORMATION_SCHEMA
또는 Catalog 탐색기를 사용하여 지정된 구체화된 뷰에 적용되는 기존 행 필터 및 column 마스크를 검사합니다. 이 기능을 사용하면 구체화된 views대한 데이터 액세스 및 보호 조치를 감사하고 검토할 수 있습니다.
제한 사항
- NULL 가능 column에 대한
sum
집계를 가진 구체화된 뷰에서 해당 column의 NULL이 아닌 마지막 값이 제거되고, 그 결과 column에NULL
values만 남아 있는 경우, 구체화된 뷰의 결과 집계 값은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 NULL
을PRIMARY KEY
와 함께 수동으로 지정해야 합니다. - 물리적으로 구현된 views는 식별자 columns 또는 대리 키를 지원하지 않습니다.
- 구현된 views는
OPTIMIZE
및VACUUM
명령을 지원하지 않습니다. 유지 관리는 자동으로 수행됩니다. - 구체화된 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;