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 Explorer 來檢視 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。 如果您提供 columnlist,那麼 column 別名的數目必須與查詢中的表達式數目相符。 如果未指定任何 columnlist,則別名將從檢視的主體中衍生出來。
-
column 名稱必須是唯一的,且對應至查詢的輸出 columns。
column_type
指定 column的數據類型。 並非所有 Azure Databricks 支援的數據類型都受到具現化 views的支援。
column_comment
描述 column的選擇性
STRING
字面值。 此選項必須與column_type
一起指定。 如果未指定 column 類型,則會略過 column 批注。column_constraint
在具體化檢視中,將資訊主鍵或資訊外鍵 constraint 加入至 column。 如果未指定 column 類型,則會略過 columnconstraint。
-
重要
這項功能處於公開預覽狀態。
新增 column 遮罩函式來匿名敏感數據。 所有來自該 column 的後續查詢將收到評估該函式的結果,該結果是以 column 替換 column的原始值後計算得出的。 對於細部訪問控制用途而言,這很實用,where 函式可以檢查叫用使用者的身分識別或群組成員資格,以判斷是否要修訂值。 如果未指定 column 類型,則會略過 column 遮罩。
-
table_constraint
在具體化檢視中,將資訊性主鍵或資訊性外鍵 constraint 添加到 table。 如果未指定 column 類型,則會略過 tableconstraint。
view_clauses
選擇性地指定新具現化檢視的分割區、註解、使用者定義屬性和 refresh 排程。 每個次子句只能指定一次。
-
要 partitiontabletablecolumns 的選擇性 list。
COMMENT view_comment
用
STRING
字面值來描述 table。-
選擇性地設定一個或多個使用者定義的屬性。
使用此設定來指定用來執行此語句的 Delta Live Tables 運行時間通道。 將 Set 的
pipelines.channel
屬性值設為"PREVIEW"
或"CURRENT"
。 預設值是"CURRENT"
。 如需 Delta Live Tables 通道的詳細資訊,請參閱 Delta Live Tables 執行通道。 SCHEDULE [ REFRESH ] schedule_clause
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 ]
使用 石英 cron 值來排程 refresh。 接受有效的 time_zone_values 。 不支援
AT TIME ZONE LOCAL
。如果
AT TIME ZONE
不存在,則會使用工作階段時區。 如果AT TIME ZONE
不存在,且會話時區未 set,則會擲回錯誤。SCHEDULE
在語意上相當於SCHEDULE REFRESH
。
-
重要
這項功能處於公開預覽狀態。
將資料列篩選功能新增至 table。 該 table 的所有後續查詢都會接收到函式評估結果為布林 TRUE 的資料列子集。 對於細緻的訪問控制而言,where 函式檢查調用者的身分識別或群組成員資格,以判斷是否需要篩選特定資料列,這是非常有用的功能。
-
AS 查詢
從基底 tables 或其他 views建構視圖的查詢。
所需的權限
建立具體化檢視 (MV) 的使用者是 MV 擁有者,且必須擁有下列權限:
-
SELECT
對 MV 所參考基底 tables 的許可權。 - 父 catalog 的
USE CATALOG
許可權,以及父 schema的USE SCHEMA
許可權。 - 與MV相關的schema的
CREATE MATERIALIZED VIEW
許可權。
對於用戶能夠 refresh MV,他們需要:
- 父 catalog 的
USE CATALOG
許可權,以及父 schema的USE SCHEMA
許可權。 - MV 的擁有權或對 MV 的
REFRESH
權限。 - MV的擁有者必須對MV所參考的基底 tables 擁有
SELECT
許可權。
使用者若要查詢 MV,他們需要:
- 父項 catalog 的
USE CATALOG
許可權,以及父項 schema的USE SCHEMA
許可權。 - 具體化檢視的
SELECT
權限。
資料列篩選和 column 遮罩
重要
這項功能處於公開預覽狀態。
每當 table 掃描擷取資料列時,資料列篩選讓您能夠指定一個函式作為過濾器來使用。 這些篩選條件可確保後續查詢只會傳回篩選條件述詞評估為 true 的資料列。
每當 table 掃描擷取數據列時,Column 遮罩可讓您遮罩 column的 values。 未來所有涉及該 column 的查詢都會接收到在 column上評估函式的結果,並取代 column的原始值。
如需瞭解如何使用數據列篩選器和 column 遮罩的更多資訊,請參閱 使用數據列篩選器和 column 遮罩篩選機密 table 數據。
管理列篩選器和 Column 遮罩
資料列篩選器和 column 遮罩應該透過 CREATE
語句新增到具體化的 views 上。
行為
-
Refresh 為 Definer:當
REFRESH MATERIALIZED VIEW
語句更新具體化檢視時,資料列篩選函式會以定義者權限執行(作為 table 擁有者)。 這表示 tablerefresh 會使用建立具體化檢視之使用者的安全性內容。 -
查詢:雖然大部分篩選都會以定義者的權限執行,但檢查使用者內容的函式 (例如
CURRENT_USER
和IS_MEMBER
) 是例外狀況。 會以叫用者的身分執行這些函式。 此方法會根據目前使用者的內容強制執行使用者特定的資料安全性和存取控制。 - 在包含行篩選和 column 遮罩的來源 tables 上建立具現化的 views 時,具現化檢視 refresh 始終是完整的 refresh。 完整的 refresh 會使用最新的定義來重新處理來源中可用的所有數據。 這可確保來源 tables 的安全策略會以最 up-to日期數據和定義進行評估並套用。
可檢視性
使用 DESCRIBE EXTENDED
、INFORMATION_SCHEMA
或 Catalog Explorer 來檢查應用於指定具體化檢視的現有列篩選器和 column 遮罩。 此功能可讓使用者稽核和檢閱具體化 views的數據存取和保護措施。
限制
- 當一個具體化檢視對 NULL-able 的 column 執行
sum
匯總,且從該 column 移除了最後一個非 NULL 值後,該 column 中僅剩下NULL
values,這時具體化檢視的結果匯總值會回傳零,而不是NULL
。 -
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;