Share via


在 Databricks SQL 中使用具體化檢視

重要

這項功能處於公開預覽狀態。

本文說明如何在 Databricks SQL 中建立和使用具體化檢視,以改善效能並降低數據處理和分析工作負載的成本。

什麼是具體化檢視?

在 Databricks SQL 中,具體化檢視是 Unity 目錄受控數據表,可讓使用者根據源數據表中最新版本的數據預先計算結果。 Azure Databricks 上的具體化檢視與其他實作不同,因為傳回的結果會反映上次重新整理具體化檢視時的數據狀態,而不是在查詢具體化檢視時一律更新結果。 您可以手動重新整理具體化檢視或排程重新整理。

具體化檢視對於數據處理工作負載非常強大,例如擷取、轉換和載入 (ETL) 處理。 具體化檢視提供簡單、宣告式的方式來處理合規性、更正、匯總或一般變更數據擷取 (CDC)。 具體化檢視可藉由預先計算緩慢的查詢和常用的計算來降低成本並改善查詢延遲。 具體化檢視也可藉由清除、擴充和反正規化基表來啟用易於使用的轉換。 具體化檢視可降低成本,同時提供簡化的用戶體驗,因為在某些情況下,他們可以累加計算基表的變更。

Databricks Data Intelligence Platform 首次支持具體化檢視,並推出 Delta Live Tables。 當您在 Databricks SQL 倉儲中建立具體化檢視時,會建立 Delta Live Tables 管線來處理具體化檢視的重新整理。 您可以在 Delta Live Tables UI、Delta Live Tables API 或 Delta Live Tables CLI 中監視重新整理作業的狀態。 請參閱 檢視具體化檢視重新整理的狀態。

需求

  • 您必須使用已啟用 Unity 目錄的 Databricks SQL 倉儲來建立和重新整理具體化檢視。

  • 您的工作區必須位於 已啟用無伺服器的區域

若要瞭解搭配 Databricks SQL 使用具體化檢視時的限制,請參閱 限制

建立具體化檢視

若要建立具體化檢視,請使用 CREATE MATERIALIZED VIEW 語句。 請參閱 Databricks SQL 參考中的 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 許可權。

下列範例會從基表base_table1建立具體化檢視mv1

CREATE MATERIALIZED VIEW mv1
AS SELECT
  date, sum(sales) AS sum_of_sales
FROM
  table1
GROUP BY
  date;

具體化檢視如何建立?

Databricks SQL 具體化檢視 CREATE 作業會使用 Databricks SQL 倉儲,在具體化檢視中建立和載入數據。 由於在 Databricks SQL 倉儲中建立具體化檢視是同步作業, CREATE MATERIALIZED VIEW 因此命令會封鎖直到建立具體化檢視並完成初始數據載入為止。 每個 Databricks SQL 具體化檢視都會自動建立 Delta Live Tables 管線。 重新整理具體化檢視時,會啟動 Delta Live Tables 管線的更新來處理重新整理。

從外部系統載入資料

Databricks 建議針對支持的數據源使用 Lakehouse 同盟載入外部數據。 如需從 Lakehouse 同盟不支援的來源載入數據的資訊,請參閱 數據格式選項

重新整理具體化檢視

作業會 REFRESH 重新整理具體化檢視,以反映基表的最新變更。 若要重新整理具體化檢視,請使用 REFRESH MATERIALIZED VIEW 語句。 請參閱 Databricks SQL 參考中的 REFRESH(MATERIALIZED VIEW 和 STREAMING TABLE )。 若要提交重新整理語句,請使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 編輯器。

只有擁有者才能 REFRESH 具體化檢視。

下列範例會 mv1 重新整理具體化檢視:

REFRESH MATERIALIZED VIEW mv1;

Databricks SQL 具體化檢視如何重新整理?

Databricks SQL 具體化檢視會使用 Delta Live Tables 進行重新整理作業。 重新整理具體化檢視時, 會開始更新 管理具體化檢視的 Delta Live Tables 管線,以處理重新整理。

因為重新整理是由 Delta Live Tables 管線所管理,因此不會使用用來建立具體化檢視的 Databricks SQL 倉儲,而且不需要在重新整理作業期間執行。

某些查詢可以累加地重新整理。 請參閱 具體化檢視的重新整理作業。 如果無法執行累加式重新整理,則會改為執行完整重新整理。

排程具體化檢視重新整理

您可以設定 Databricks SQL 具體化檢視,根據定義的排程自動重新整理。 當您使用 ALTER VIEW 語句建立具體化檢視或新增排程時,SCHEDULE請使用 子句設定此排程。 建立排程時,會自動將新的 Databricks 作業設定為處理更新。 您可以使用語句隨時 DESCRIBE EXTENDED 檢視排程。

更新具體化檢視的定義

若要更新具體化檢視的定義,您必須先卸除,然後重新建立具體化檢視。

卸除具體化檢視

注意

若要提交命令以卸除具體化檢視,您必須是該具體化檢視的擁有者。

若要卸除具體化檢視,請使用 DROP VIEW 語句。 若要提交DROP語句,您可以在 Azure Databricks UI、Databricks SQL CLIDatabricks 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 管線會管理具體化檢視重新整理,因此管線的啟動時間會產生延遲。 除了執行重新整理所需的時間外,這個時間可能還以秒到分鐘為單位。

您可以檢視具體化檢視重新整理的狀態,方法是檢視管理 Delta Live Tables UI 中具體化檢視的管線,或檢視具體化檢視命令所DESCRIBE EXTENDED傳回的重新整理資訊

您也可以藉由查詢 Delta Live Tables 事件記錄來檢視具體化檢視的重新整理歷程記錄。 請參閱 檢視具體化檢視的重新整理記錄。

在 Delta Live Tables UI 中檢視重新整理狀態

根據預設,管理具體化檢視的 Delta Live Tables 管線不會顯示在 Delta Live Tables UI 中。 若要在 Delta Live Tables UI 中檢視管線,您必須直接存取管線的 [管線詳細 數據] 頁面的連結。 若要存取連結:

  • 如果您在 SQL 編輯器中提交REFRESH命令,請遵循 [結果] 面板中的連結
  • 遵循語句所 DESCRIBE EXTENDED 傳回的連結。
  • 具體化檢視的譜系 索引標籤上,按兩下 [ 管線] ,然後按兩下管線連結。

停止使用中的重新整理

若要停止差異即時數據表 UI 中的作用中重新整理,請在 [ 管線詳細 數據] 頁面中按兩下 [ 停止 ] 停止管線更新。 您也可以使用 Databricks CLIPOST /api/2.0/pipelines/{pipeline_id}/stop 作業在 Pipelines API 中停止重新整理。

變更具體化檢視的擁有者

如果您是中繼存放區管理員和工作區管理員,則可以變更具體化檢視的擁有者。具體化檢視會自動建立和使用 Delta Live Tables 管線來處理變更。 使用下列步驟來變更具體化檢視擁有者:

  • 按兩下 [作業圖示工作流程],然後按兩下 [差異實時數據表] 索引標籤。
  • 按兩下您要變更其擁有者之管線的名稱。
  • Kebab 功能表按兩下管線名稱右邊的Kebab功能表,然後按下 [許可權]。 這會開啟許可權對話框。
  • 按兩下 目前擁有者名稱右邊的 x ,以移除目前的擁有者。
  • 開始輸入以篩選可用用戶的清單。 按兩下應為新管線擁有者的使用者。
  • 按兩下 [ 儲存 ] 以儲存變更並關閉對話框。

所有管線資產,包括管線中定義的具體化檢視,都是由新的管線擁有者所擁有。 所有未來的更新都會使用新擁有者的身分識別來執行。

控制具體化檢視的存取

具體化檢視支援豐富的訪問控制,以支持數據共享,同時避免公開潛在的私人數據。 具體化檢視擁有者可以將許可權授 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;

SELECT 從具體化檢視擁有者或任何其他已獲授 SELECT 與具體化檢視許可權的使用者撤銷基表的許可權,或卸除基表時,具體化檢視擁有者或使用者授與存取權仍然可以查詢具體化檢視。 不過,會發生下列行為:

  • 具體化檢視擁有者或失去具體化檢視存取權的其他人無法再 REFRESH 取得具體化檢視,具體化檢視就會變成過時。
  • 如果使用排程進行自動化,則下一個排程會 REFRESH 失敗或未執行。

下列範例會 SELECTmv1撤銷權限:

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 事件記錄檔?

判斷是否使用累加式或完整重新整理

為了將具體化檢視重新整理的效能優化,Azure Databricks 會使用成本模型來選取用於重新整理的技術。 下表描述這些技術:

技術 累加式重新整理? 描述
FULL_RECOMPUTE No 具體化檢視已完全重新計算
NO_OP 不適用 具體化檢視未更新,因為未偵測到基表的變更。
ROW_BASEDPARTITION_OVERWRITE Yes 具體化檢視使用指定的技術以累加方式重新整理。

若要判斷所使用的技術,請查詢 Delta Live Tables 事件記錄檔,其中 event_typeplanning_information

SELECT
  timestamp,
  message
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = 'planning_information'
ORDER BY
  timestamp desc;

將 取代 <fully-qualified-table-name> 為具體化檢視的完整名稱,包括目錄和架構。

請參閱 什麼是 Delta Live Tables 事件記錄檔?

限制

  • 如何管理MV,以及其可查詢的位置有一定限制:

    • Databricks SQL 具體化檢視只能在 Pro SQL 倉儲和無伺服器 SQL 倉儲中建立和重新整理。
    • Databricks SQL 具體化檢視只能從建立它的工作區重新整理。
    • Databricks SQL 具體化檢視只能從 Databricks SQL 倉儲、Delta 實時數據表,以及執行 Databricks Runtime 11.3 或更新版本之共用叢集進行查詢。 您無法從單一使用者存取模式叢集查詢具體化檢視。
  • 具體化檢視不支持識別數據行或代理索引鍵。

  • 如果具體化檢視在能夠的數據行上使用 NULL總和匯總,而且只有 NULL 值會保留在該數據行中,具體化檢視結果匯總值為零,而不是 NULL

  • 支援具體化檢視的基礎檔案可能包含上游數據表的數據(包括可能的個人標識資訊),這些檔案不會出現在具體化檢視定義中。 此數據會自動新增至基礎記憶體,以支援具體化檢視的累加式重新整理。 由於具體化檢視的基礎檔案可能會有從上游數據表公開數據的風險,不屬於具體化檢視架構的一部分,因此 Databricks 建議不要與不受信任的下游取用者共用基礎記憶體。 例如,假設具體化檢視的定義包含 子 COUNT(DISTINCT field_a) 句。 即使具體化檢視定義只包含匯總 COUNT DISTINCT 子句,基礎檔案仍會包含的實際值 field_a清單。

  • 美國中南部和美國西部 2 個區域不支援 Databricks SQL 具體化檢視。