使用 Databricks SQL 中的具體化檢視
注意
如果需要搭配使用 Azure Private Link 連線與具體化檢視,請連絡 Databricks 代表。
本文說明如何在 Databricks SQL 中建立和使用具體化檢視,以改善效能並降低資料處理和分析工作負載的成本。
重要
Databricks SQL 中建立的具體化檢視是由無伺服器 Delta Live Tables 管線所支援。 您的工作區必須支持無伺服器管線才能使用這項功能。
什麼是具體化檢視?
在 Databricks SQL 中,具體化檢視是 Unity Catalog 管理的資料表,可讓使用者根據來源資料表中最新版本的資料預先計算結果。 Azure Databricks 上的具體化檢視與其他實作不同,因為傳回的結果會反映上次重新整理具體化檢視時的資料狀態,而不是在查詢具體化檢視時總是更新結果。 可以手動重新整理具體化檢視或排程重新整理。
具體化檢視非常強大,適合資料處理工作負載,例如擷取、轉換和載入 (ETL) 處理。 具體化檢視提供簡單、宣告式方式來處理資料的合規性、更正、彙總或一般異動資料擷取 (CDC)。 透過預先計算緩慢的查詢和常用的計算,具體化檢視可降低成本並改善查詢延遲。 具體化檢視也可透過清除、擴充和反正規化基底資料表來啟用便於使用的轉換。 具體化檢視可降低成本,同時提供簡化的最終使用者體驗,因為在某些情況下,他們可以累加計算基底資料表的變更。
隨著 Delta Live Tables 的推出,在 Azure Databricks 中首次支援具體化檢視。 當您在 Databricks SQL 倉儲中建立具體化檢視時, 會建立無伺服器管線 來處理具體化檢視的重新整理。 您可以在 Delta Live Tables UI 或管線 API 中監視重新整理作業的狀態。 請參閱檢視具體化檢視重新整理的狀態。
需求
若要建立或重新整理具體化檢視:
必須使用已啟用 Unity Catalog 的專業或無伺服器 SQL 倉儲。
若要重新整理具體化檢視,您必須位於建立該檢視的工作區中。
您的工作區必須位於支援無伺服器 SQL 倉儲的區域。
若要查詢具體化檢視:
- 您必須是具體化檢視的擁有者,或擁有具體化檢視的
SELECT
權限,以及其父系的USE SCHEMA
和USE CATALOG
權限。 - 必須使用下列其中一個計算資源:
- SQL 倉儲
- Delta Live Tables 介面
- 共用存取模式計算
- 只要已啟用無伺服器計算的工作區,Databricks Runtime 15.4 和更新版本上的單一使用者存取模式即可。 請參閱 單一用戶計算的細微訪問控制。
- 只有當您是具體化檢視擁有者:在 14.3 和 15.3 之間執行 Databricks Runtime 的單一使用者存取模式計算資源。
若要瞭解有關使用具體化檢視的其他限制,請參閱限制。
建立具體化檢視
Databricks SQL 具體化檢視 CREATE
操作使用 Databricks SQL 倉儲,在具體化檢視中建立和載入資料。 建立具體化檢視是一個同步操作,這表示 CREATE MATERIALIZED VIEW
命令會封鎖,直到建立具體化檢視以及初始資料載入完成為止。 系統會自動為每個 Databricks SQL 具體化檢視建立無伺服器 Delta Live Tables 管線。
重新整理具體化檢視時,Delta Live Tables 管線會處理重新整理。
若要建立具體化檢視,請使用 CREATE MATERIALIZED VIEW
陳述式。 若要提交建立陳述式,請使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 編輯器。
注意
建立具體化檢視的使用者是具體化檢視擁有者,且必須擁有下列權限:
- 具體化檢視所參考基底資料表的
SELECT
權限。 - 包含具體化檢視之來源資料表的目錄和結構描述的
USE CATALOG
和USE SCHEMA
權限。 - 具體化檢視的目標目錄和結構描述的
USE CATALOG
和USE SCHEMA
權限。 - 包含具體化檢視的結構描述的
CREATE TABLE
和CREATE MATERIALIZED VIEW
權限。
下列範例會從基底資料表 mv1
中建立具體化檢視 base_table1
:
CREATE MATERIALIZED VIEW mv1
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
基礎表格上的欄位註釋會自動傳播至新的實體化檢視。 若要新增排程、數據表條件約束或其他屬性,請修改具體化檢視定義。 若要瞭解定義具體化檢視的語法詳細資料,請參閱 CREATE MATERIALIZED VIEW。
設定運行時間通道
使用 SQL 倉儲建立的具體化檢視,會使用 Delta Live Tables 管線自動重新整理。 Delta Live Tables 管線預設會使用通道中的 current
運行時間。 請參閱 Delta Live Tables 版本資訊和發行升級程式 ,以了解發行程式。
Databricks 建議針對生產工作負載使用 current
通道。 新功能會先發行至 preview
通道。 您可以將管線設定為預覽 Delta Live Tables 通道,藉由指定 preview
做為數據表屬性來測試新功能。 您可以在建立資料表時或在使用 ALTER 語句建立資料表之後指定這個屬性。
下列程式代碼範例示範如何在 CREATE 語句中將通道設定為預覽:
CREATE OR REPLACE MATERIALIZED VIEW foo.default.bar
TBLPROPERTIES ('pipelines.channel' = 'preview') as
SELECT
*
FROM
range(5)
從外部系統載入資料
Databricks 建議使用 Lakehouse Federation 針對支援的資料來源載入外部資料。 如需有關從 Lakehouse Federation 不支援的來源中載入資料的資訊,請參閱資料格式選項。
重新整理具體化檢視
REFRESH
操作會重新整理具體化檢視,以反映基底資料表的最新變更。 操作預設為同步,這表示命令會封鎖,直到重新整理操作完成為止。 若要重新整理具體化檢視,請使用 REFRESH MATERIALIZED VIEW
陳述式。 如需此命令的 SQL 語法和參數的詳細資訊,請參閱 REFRESH (MATERIALIZED VIEW or STREAMING TABLE)。 若要深入瞭解可累加重新整理的具體化檢視類型,請參閱 具體化檢視的累加式重新整理。
若要提交重新整理陳述式,請使用 Azure Databricks UI、連結至 SQL 倉儲的筆記本、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 編輯器。
只有擁有者才能 REFRESH
具體化檢視。
下列範例會重新整理 mv1
具體化檢視:
REFRESH MATERIALIZED VIEW mv1;
Databricks SQL 具體化檢視如何重新整理?
具體化檢視會自動建立和使用無伺服器 Delta Live Tables 管線來處理重新整理操作。 重新整理由 Delta Live Tables 管線所管理,而更新由用來建立具體化檢視的 Databricks SQL 倉儲所監視。 具體化檢視可以使用依排程執行的 Delta Live Tables 管線來更新。 請參閱 觸發與連續管線模式。
注意
Delta Live Tables 執行階段無法偵測非 Delta 資料來源中的變更。 資料表仍會定期更新,但具有較高的預設觸發間隔,以避免過度重新計算降低計算時發生的任何累加處理。
根據預設,會同步執行重新整理操作。 也可以將重新整理操作設定為非同步發生。 這可以使用重新整理命令來設定。 請參閱 REFRESH (MATERIALIZED VIEW 或 STREAMING TABLE) 與每個方法相關聯的行為如下所示:
- 同步:同步重新整理可防止其他作業繼續,直到重新整理完成為止。 如果下一個步驟需要結果,例如在 Databricks 作業等協調流程工具中排序重新整理作業時,請使用同步重新整理。 若要使用作業協調具體化檢視,請使用 SQL 工作類型。 請參閱排程及協調工作流程。
- 異步:當具體化檢視重新整理開始時,異步重新整理會在 Delta Live Tables 計算上啟動背景作業,讓命令在數據載入完成之前傳回。 此重新整理類型可以節省成本,因為作業不一定會在起始命令的倉儲中保存計算容量。 如果重新整理變成閑置且沒有其他工作正在執行,則當重新整理使用其他可用的計算時,倉儲可以關閉。 此外,異步重新整理支援平行啟動多個作業。
某些查詢可以累加地重新整理。 請參閱 具體化檢視的累加式重新整理。 如果無法執行累加式重新整理,則會改為執行完整重新整理。
排程具體化檢視重新整理
您可以設定 Databricks SQL 具體化檢視,根據定義的排程自動重新整理。 若要設定排程,請執行下列其中一項:
- 當您
SCHEDULE
時,請使用 子句設定排程 - 使用 ALTER MATERIALIZED VIEW 陳述式新增排程。
建立排程後,會自動將新的 Databricks 工作設定為處理更新。
若要檢視排程,請執行下列其中一項動作:
- 從 Azure Databricks UI 中的 SQL 編輯器執行
DESCRIBE EXTENDED
陳述式。 - 使用目錄總管來檢視具體化檢視。 排程會列出在 [概觀] 索引標籤的 [重新整理狀態] 底下。 請參閱什麼是目錄總管?。
檢視具體化檢視重新整理的狀態
注意
由於 Delta Live Tables 管線會管理具體化檢視重新整理,因此管線的啟動時間會產生延遲。 除了執行重新整理所需的時間外,此時間可能以秒到分鐘為單位。
可以透過在 Delta Live Tables UI 中檢視管理具體化檢視的管道,或檢視具體化檢視的 命令所傳回的DESCRIBE EXTENDED
,來檢視具體化檢視重新整理的狀態。
透過查詢 Delta Live Tables 事件記錄,也可檢視具體化檢視的重新整理歷史記錄。 請參閱<檢視具體化檢視的重新整理歷史記錄>。
使用查詢歷程記錄監視執行
您可以使用查詢歷程記錄頁面來存取查詢詳細數據和查詢配置檔,以協助您識別用來執行串流數據表更新之 Delta Live Tables 管線中效能不佳的查詢和瓶頸。 如需查詢歷程記錄和查詢配置檔可用資訊類型的概觀,請參閱 查詢歷程記錄 和 查詢配置檔。
重要
這項功能處於公開預覽狀態。 工作區管理員可以從 [預覽 ] 頁面啟用這項功能。 請參閱管理 Azure Databricks 預覽版。
與具體化檢視相關的所有語句都會出現在查詢記錄中。 您可以使用 [語句 ] 下拉式篩選來選取任何命令,並檢查相關的查詢。 所有 CREATE
語句後面接著在 REFRESH
Delta Live Tables 管線上以異步方式執行的語句。 這些 REFRESH
語句通常包含詳細的查詢計劃,以提供優化效能的見解。
若要存取 REFRESH
查詢歷程記錄 UI 中的語句,請使用下列步驟:
- 按兩下 左側提要欄位以開啟 [查詢歷程記錄 ] UI。
- 從 [語句] 下拉式篩選選取 [重新整理] 複選框。
- 按兩下查詢語句的名稱,即可檢視摘要詳細數據,例如查詢的持續時間和匯總計量。
- 按兩下 [ 查看查詢設定檔 ] 以開啟查詢設定檔。 如需巡覽查詢配置檔的詳細資訊,請參閱 查詢配置檔。
- 或者,使用 [ 查詢來源 ] 區段中的鏈接來開啟相關的查詢或管線。
注意
具體化檢視必須設定為使用預覽通道執行。 請參閱 設定運行時間通道。
請參閱 建立具體化檢視。
在 Delta Live Tables UI 中檢視重新整理狀態
根據預設,管理具體化檢視的 Delta Live Tables 管線不會顯示在 Delta Live Tables UI 中。 若要在 Delta Live Tables UI 中檢視管線,您必須直接存取管線的 [管線詳細資料] 頁面的連結。 若要存取該連結:
- 複製並貼上 陳述式所傳回資料表之 [最新重新整理] 資料列中所顯示的連結。
DESCRIBE EXTENDED
- 在具體化檢視的譜系索引標籤上,按一下 [管線],然後按下管線連結。
針對在 Azure Databricks UI 中使用 SQL 編輯器提交的非同步 REFRESH
命令,可以遵循 [結果] 面板中所示的連結來檢視重新整理狀態。
停止使用中的重新整理
若要停止 Delta Live Tables UI 中的作用中重新整理,請在 [管線詳細資料] 頁面中按一下 [停止] 以停止管線更新。 也可以使用 Databricks CLI 或 POST /api/2.0/pipelines/{pipeline_id}/stop 操作在 Pipelines API 中停止重新整理。
更新具體化檢視的定義
若要更新具體化檢視的定義,必須先卸除,然後重新建立具體化檢視。
卸除具體化檢視
注意
若要提交命令以卸除具體化檢視,您必須是該具體化檢視的擁有者,或具有具體化檢視的 MANAGE
許可權。
若要卸除具體化檢視,請使用 DROP VIEW 陳述式。 若要提交 DROP
陳述式,請使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 編輯器。 下列範例會卸除 mv1
具體化檢視:
DROP MATERIALIZED VIEW mv1;
描述具體化檢視
若要擷取具體化檢視的資料行和資料類型,請使用 DESCRIBE
陳述式。 若要擷取具體化檢視的資料行、資料類型和中繼資料,例如擁有者、位置、建立時間和重新整理狀態,請使用 DESCRIBE EXTENDED
。 若要提交 DESCRIBE
陳述式,請使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 編輯器。
變更具體化檢視的擁有者
如果您是中繼存放區管理員和工作區管理員,則可以變更具體化檢視的擁有者。具體化檢視會自動建立和使用 Delta Live Tables 管線來處理變更。 使用下列步驟來變更具體化檢視擁有者:
- 在具體化檢視的譜系索引標籤上,按一下 [管線],然後按下管線連結。
- 按一下管線名稱右邊的 Kebab 功能表,然後按一下 [權限]。 這會開啟權限對話方塊。
- 按一下目前擁有者名稱右邊的 x,以移除目前的擁有者。
- 開始輸入以篩選可用使用者的清單。 按一下應為新管線擁有者的使用者。
- 按一下 [儲存],儲存變更並關閉對話方塊。
包括管線中定義的具體化檢視在內的所有管線資產都由新的管線擁有者所擁有。 會使用新擁有者的身分來執行未來的所有更新。
控制具體化檢視的存取
具體化檢視支援豐富的存取控制,以支援資料共用,同時避免公開潛在的私人資料。 具體化檢視擁有者或具有 MANAGE
許可權的使用者,可以將 SELECT
許可權授與其他使用者。 擁有具體化檢視 SELECT
存取權的使用者不需要具體化檢視所參考的資料表的 SELECT
存取權。 此存取控制可啟用資料共用,同時控制基礎資料的存取。
授與具體化檢視權限
若要授與具體化檢視的存取權,請使用 GRANT
陳述式:
GRANT
privilege_type [, privilege_type ] ...
ON <mv_name> TO principal;
privilege_type 可以是:
-
SELECT
- 使用者可以SELECT
具體化檢視。 -
REFRESH
- 使用者可以REFRESH
具體化檢視。 使用擁有者權限來執行重新整理。
下列範例會建立具體化檢視,並將選取和重新整理權限授與給使用者:
CREATE MATERIALIZED VIEW <mv_name> AS SELECT * FROM <base_table>;
GRANT SELECT ON <mv_name> TO user;
GRANT REFRESH ON <mv_name> TO user;
撤銷具體化檢視的權限
若要撤銷具體化檢視的存取權,請使用 REVOKE
陳述式:
REVOKE
privilege_type [, privilege_type ]
ON <name> FROM principal;
如果從具體化檢視擁有者或任何其他已獲得具體化檢視 MANAGE
或 SELECT
權限的使用者撤銷基表的 SELECT
權限,或基表被刪除,具體化檢視擁有者或被授予訪問權限的使用者仍然可以查詢具體化檢視。 但是,會發生下列行為:
- 具體化檢視擁有者或失去具體化檢視存取權的其他人無法再
REFRESH
具體化檢視,具體化檢視就會變為過時。 - 如果使用排程進行自動化,則下一個排程的
REFRESH
會失敗或未執行。
下列範例會從 SELECT
撤銷 mv1
權限:
REVOKE SELECT ON mv1 FROM user1;
啟用變更資料摘要
具體化檢視基底資料表上需要變更資料摘要,但某些進階使用案例除外。 若要在基底資料表上啟用變更資料摘要,請使用下列語法來設定 delta.enableChangeDataFeed
資料表屬性:
ALTER TABLE table1 SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
檢視具體化檢視的重新整理歷史記錄
若要檢視具體化檢視上的 REFRESH
操作狀態,包括目前和過去的重新整理,請查詢 Delta Live Tables 事件記錄檔:
SELECT
*
FROM
event_log(TABLE(<fully-qualified-table-name>))
WHERE
event_type = "update_progress"
ORDER BY
timestamp desc;
將 <fully-qualified-table-name>
取代為具體化檢視的完整名稱,包括目錄和結構描述。
請參閱什麼是 Delta Live Tables 事件記錄檔?。
限制
- 如需計算和工作區需求,請參閱需求。
- 具體化檢視不支援識別欄位或代理索引鍵。
- 如果具體化檢視在可為
NULL
的資料行上使用總和彙總,而且只有NULL
值保留在該資料行中,則具體化檢視結果彙總值為零,而不是NULL
。 - 您無法從具體化檢視中讀取變更資料摘要。
- 時間移動查詢不會在具體化檢視上報告。
- 支援具體化檢視的基礎檔案可能包含上游資料表的資料 (包括可能的個人識別資訊),它們不會出現在具體化檢視定義中。 此資料會自動新增至基礎儲存體,以支援具體化檢視的累加式重新整理。 由於具體化檢視的基礎檔案可能會公開不屬於具體化檢視結構描述的上游資料表的資料,因此 Databricks 建議不要與不受信任的下游取用者共用基礎儲存體。 例如,假設具體化檢視的定義包含
COUNT(DISTINCT field_a)
子句。 即使具體化檢視定義只包含彙總COUNT DISTINCT
子句,基礎檔案仍會包含field_a
的實際值清單。