共用方式為


具體化檢視的累加式重新整理

本文概述具體化檢視上累加式重新整理的語意和需求,並識別支援累加式重新整理的 SQL 作業、關鍵詞和子句。 其中包含累加式和完整重新整理之間的差異討論,並包含在具體化檢視和串流數據表之間選擇的建議。

使用無伺服器管線在具體化檢視上執行更新時,可以累加地重新整理許多查詢。 累加式重新整理會偵測用來定義具體化檢視的數據源變更,並累加計算結果,藉以節省計算成本。

累加式重新整理需要無伺服器管線

具體化檢視的累加式重新整理需要無伺服器管線。

Databricks SQL 中定義的具體化檢視重新整理作業一律使用無伺服器管線執行。

針對使用 Delta Live Tables 管線定義的具體化檢視,您必須將管線設定為使用無伺服器。 請參閱 設定無伺服器差異實時數據表管線

具體化檢視的重新整理語意為何?

具體化檢視保證與批次查詢的對等結果。 例如,請考慮下列匯總查詢:

SELECT account_id,
  COUNT(txn_id) txn_count,
  SUM(txn_amount) account_revenue
FROM transactions_table
GROUP BY account_id

當您使用任何 Azure Databricks 產品執行此查詢時,結果會使用批次語意來計算,以匯總來源 transactions_table中的所有記錄,這表示所有源數據都會在一個作業中掃描和匯總。

注意

如果數據源在執行最後一個查詢之後尚未變更,某些 Azure Databricks 產品會自動在會話內或跨會話快取結果。 自動快取行為與具體化檢視不同。

下列範例會將此批次查詢轉換成具體化檢視:

CREATE OR REFRESH MATERIALIZED VIEW transation_summary AS
SELECT account_id,
  COUNT(txn_id) txn_count,
  SUM(txn_amount) account_revenue
FROM transactions_table
GROUP BY account_id

當您重新整理具體化檢視時,計算結果會與批次查詢語意相同。 此查詢是具體化檢視的範例,可累加地重新整理,這表示重新整理作業會盡最大努力嘗試只處理來源 transactions_table 中新的或已變更的數據來計算結果。

具體化檢視的數據源考慮

雖然您可以針對任何數據源定義具體化檢視,但並非所有數據源都非常適合具體化檢視。 請考慮下列注意事項和建議:

重要

具體化檢視會盡最大努力嘗試以累加方式重新整理支援作業的結果。 數據源中的某些變更需要完整重新整理。

具體化檢視的所有數據源都應該健全到完整重新整理語意,即使定義具體化檢視的查詢支援累加式重新整理也一樣。

  • 對於完整重新整理的成本禁止的查詢,請使用串流數據表來保證一次完全處理。 範例包括非常大的數據表。
  • 如果記錄應該只處理一次,請勿針對數據源定義具體化檢視。 請改用串流數據表。 範例包括下列各項:
    • 未保留數據歷程記錄的數據源,例如 Kafka。
    • 內嵌作業,例如使用自動載入器從雲端物件記憶體擷取數據的查詢。
    • 您打算在處理之後刪除或封存數據,但需要在下游數據表中保留資訊的任何數據源。 例如,您打算刪除早於特定臨界值之記錄的日期分割數據表。
  • 並非所有數據源都支援累加式重新整理。 下列資料源支援累加式重新整理:
    • 差異數據表,包括由 Delta Lake 支援的 Unity 目錄受控數據表和外部數據表。
    • 具體化檢視。
    • 串流數據表,包括作業的目標 APPLY CHANGES INTO
  • 某些累加式重新整理作業需要在查詢的數據源上啟用數據列追蹤。 數據列追蹤是 Delta 數據表僅支援的差異湖功能,其中包括具體化檢視、串流數據表和 Unity 目錄受管理資料表。 請參閱對差異資料表使用資料列追蹤

優化具體化檢視

為了獲得最佳效能,Databricks 建議在所有具體化檢視源數據表上啟用下列功能:

具體化檢視的重新整理類型

具體化檢視的重新整理是完整或增量檢視。 對於所有作業,累加式重新整理和完整重新整理的結果都相同。 Azure Databricks 會執行成本分析,以識別數據源的變更是否需要完整重新整理。

若要判斷所使用更新的重新整理類型,請參閱 判斷更新的重新整理類型。

完整重新整理

完整重新整理會重新處理來源中所有可用的數據,以覆寫具體化檢視中的結果。 根據數據源變更的方式,所有具體化檢視可能會在任何指定的更新上完整重新整理。

您可以選擇性地強制完整重新整理。 針對使用 Databricks SQL 定義的具體化檢視,請使用下列語法:

REFRESH MATERIALIZED VIEW mv_name FULL

針對 Delta Live Tables 管線中定義的具體化檢視,您可以選擇在選取的數據集或管線中的所有數據集上執行完整重新整理。 請參閱 Delta Live Tables 如何更新數據表和檢視表。

重要

針對因數據保留閾值或手動刪除而移除記錄的數據源執行完整重新整理時,移除的記錄不會反映在計算結果中。 如果資料來源中的資料不再可供使用,您可能無法復原舊資料。

注意

您可以選擇性地停用資料表的完整重新整理,方法是將資料表屬性 pipelines.reset.allowed 設定為 false

累加式重新整理

累加式重新整理會在上次重新整理之後處理基礎數據的變更,然後將該數據附加至數據表。 根據基底資料表和包含的作業,只能累加地重新整理特定類型的具體化檢視。

只有使用無伺服器管線更新的具體化檢視才能使用累加式重新整理。 未使用無伺服器管線的具體化檢視一律會完全重新整理。

使用 SQL 倉儲或無伺服器差異即時資料表管線建立具體化檢視時,如果支援其查詢,它們會自動累加地重新整理。 如果查詢包含累加式重新整理不支援的表達式,則會執行完整重新整理,因而產生額外的成本。

支援具體化檢視累加式重新整理

下表列出了 SQL 關鍵字或子句對累加式重新整理的支援。

重要

某些關鍵詞和子句需要在查詢的數據源上啟用數據列追蹤。 請參閱對差異資料表使用資料列追蹤

下表中這些關鍵詞和子句會以星形 \ 標示。

SQL 關鍵字或子句 支援累加式重新整理
SELECT 運算式* 是的,支援包括決定性內建函數和不可變使用者定義函數 (UDF) 的運算式。
GROUP BY Yes
WITH 是,支援通用資料表運算式。
UNION ALL* Yes
FROM 支援的基底資料表包括差異資料表、具體化檢視和串流資料表。
WHERE, HAVING* 支援篩選子句,例如和 WHEREHAVING
INNER JOIN* Yes
LEFT OUTER JOIN* .是
FULL OUTER JOIN* .是
RIGHT OUTER JOIN* Yes
OVER 是。 必須為視窗函數的累加化指定 PARTITION_BY 資料列。
QUALIFY Yes
EXPECTATIONS 否。 使用預期的具體化檢視一律會完整重新整理。

注意

不支援非決定性函數,例如 CURRENT_TIMESTAMP

判斷更新的重新整理類型

為了最佳化具體化檢視重新整理的效能,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 事件記錄檔?