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
중 최대 하나를 지정할 수 있습니다.-
새로 만들어진 뷰의 이름입니다. 정규화된 뷰 이름은 고유해야 합니다.
column_list
선택적으로 뷰의 쿼리 결과에서 열에 레이블을 지정합니다. 열 목록을 제공하는 경우 열 별칭의 수는 쿼리의 식 수와 일치해야 합니다. 열 목록이 지정되지 않은 경우 별칭은 보기의 본문에서 파생됩니다.
-
열 이름은 고유해야 하며 쿼리의 출력 열에 매핑되어야 합니다.
column_type
열 데이터 형식을 지정합니다. Azure Databricks에서 지원되는 모든 데이터 형식이 구체화된 뷰에서 지원되는 것은 아닙니다.
column_comment
열을 설명하는 선택 가능한
STRING
리터럴입니다. 이 옵션은column_type
과 함께 지정해야 합니다. 열 형식을 지정하지 않으면 열 설명을 건너뜁니다.column_constraint
구체화된 뷰의 열에 정보 기본 키 또는 정보 외래 키 제약 조건을 추가합니다. 열 형식을 지정하지 않으면 제약 조건을 건너뜁니다.
-
Important
이 기능은 공개 미리 보기 상태입니다.
열 마스크 함수를 추가하여 중요한 데이터를 익명화합니다. 해당 열의 모든 후속 쿼리는 열의 원래 값 대신 열에 대해 해당 함수를 평가한 결과를 받게 됩니다. 이는 함수가 값을 수정할지 여부를 결정하기 위해 호출하는 사용자의 ID 및/또는 그룹 구성원을 검사할 수 있는 세분화된 액세스 제어 목적에 유용할 수 있습니다. 열 형식을 지정하지 않으면 열 마스크를 건너뜁니다.
-
table_constraint
구체화된 뷰의 테이블에 정보 기본 키 또는 정보 외래 키 제약 조건을 추가합니다. 열 형식을 지정하지 않으면 테이블 제약 조건을 건너뜁니다.
view_clauses
필요에 따라 분할, 설명, 사용자 정의 속성 및 새 구체화된 뷰에 대한 새로 고침 일정을 지정합니다. 각 하위 절은 한 번만 지정할 수 있습니다.
-
테이블을 분할할 테이블의 열에 대한 선택적 목록입니다.
COMMENT view_comment
테이블을 설명하는
STRING
리터럴입니다.-
선택적으로 하나 이상의 사용자 정의 속성을 설정합니다.
이 설정을 사용하여 이 문을 실행하는 데 사용되는 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
, ,HOURS
DAY
DAYS
WEEK
, 또는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됩니다.SCHEDULE
은SCHEDULE 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_USER
및IS_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 NULL
을PRIMARY KEY
와 함께 수동으로 지정해야 합니다. - 구체화된 뷰는 ID 열 또는 서로게이트 키를 지원하지 않습니다.
- 구체화된 뷰는
OPTIMIZE
및VACUUM
명령을 지원하지 않습니다. 유지 관리는 자동으로 수행됩니다. - 구체화된 뷰는 데이터 품질 제약 조건을 정의하는 기대치를 지원하지 않습니다.
예제
-- 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;