如同標準檢視,具體化檢視是查詢的結果,而且您存取它們的方式與數據表相同。 與標準檢視每次查詢都會重新計算結果不同,具體化檢視會快取結果並在指定時間區間刷新。 因為具體化檢視已預先計算,所以針對它的查詢執行速度會比一般檢視快得多。
關於何時使用實體化視圖與串流資料表或視圖的指引,請參閱《 什麼是管線?》。
具體化視圖是宣告式管線物件。 它包含定義它的 查詢 、更新它的 流程 ,以及快速存取的快取結果。 具體化視圖
- 追蹤上游數據的變更。
- 在觸發時,逐步處理已變更的數據,並套用必要轉換。
- 根據指定的重新整理間隔,維護與源數據同步的輸出數據表。
具現化檢視是許多轉換的絕佳選擇:
- 您可以套用對快取結果而非數據列的推理。 事實上,您只需撰寫查詢即可。
- 它們在更新當下總是正確的。 所有必要數據都會被處理,即使數據到達時間延遲或順序不對也一樣。
- 它們通常是累加的。 Azure Databricks 嘗試選擇適當的策略,以降低更新實體化視圖的成本。
如何運作具象化視圖
下圖說明具體化檢視的運作方式。
具體化檢視是由單一資料處理管線定義和更新。 您可以在管線的原始碼中明確定義具體化檢視。 管線所定義的數據表無法由任何其他管線變更或更新。
Note
當你建立獨立的實體化視圖時,在 Lakeflow 管線之外,Azure Databricks 會建立一條管線用來更新該視圖。 您可以從工作區的左側導覽中選取 [作業與管線] 來查看管線。 您可以將 [管線類型 ] 資料行新增至檢視。 管線中定義的具現化檢視類型為 ETL。 獨立的具體化檢視屬於 MV/ST 類型。 請參見 使用獨立的物質化視圖。
Azure Databricks 使用 Unity Catalog 來儲存檢視的元資料,包括查詢及用於增量更新的額外系統檢視。 Azure Databricks 將快取的資料實體化於雲端儲存中。 Azure Databricks 會在目錄中儲存一些後備資料__databricks_internal。 請參閱__databricks_internal目錄。
Note
Azure Databricks 建立內部資料表以支援實體化檢視的增量刷新。 這些表格會出現在 system.information_schema.tables,但是不會顯示在目錄檔案總管或其他工作區 UI 表面中。
下列範例會聯結兩個數據表,並使用具體化檢視讓結果保持最新狀態。
Python
from pyspark import pipelines as dp
@dp.materialized_view
def regional_sales():
partners_df = spark.read.table("partners")
sales_df = spark.read.table("sales")
return (
partners_df.join(sales_df, on="partner_id", how="inner")
)
SQL
CREATE OR REPLACE MATERIALIZED VIEW regional_sales
AS SELECT *
FROM partners
INNER JOIN sales USING (partner_id);
自動累加式更新
當觸發定義一個具體化視圖的管線時,該視圖會自動保持最新狀態,通常是以增量更新的方式。 Azure Databricks 會嘗試僅處理為了讓實體化檢視保持最新狀態所必須處理的資料。 實體化檢視總是顯示正確結果,即使需要從頭完全重新計算查詢結果,但 Azure Databricks 通常只會對實體化檢視進行漸進式更新,這比重新計算成本低得多。
下圖顯示稱為 sales_report的具體化檢視,這是聯結兩個稱為 clean_customers 和 clean_transactions的上游數據表,以及依國家/地區分組的結果。 上游程序將 200 列插入 clean_customers,涉及三個國家(美國、荷蘭、英國),並更新 clean_transactions 中的 5,000 列,以對應於這些新客戶。 具現化 sales_report 檢視只會針對有新客戶或相應交易的國家/地區進行增量更新。 在這個範例中,只有三個資料列會更新,而不是整份銷售報表。
如需瞭解具體化檢視中增量更新的詳細資訊,請參閱 具體化檢視的增量更新。
實體化視圖限制
具體化檢視具有下列限制:
- 由於更新會建立正確的查詢,因此輸入的一些變更需要完整重新計算實體化視圖,這可能會成本高昂。
- 它們並非針對低延遲使用案例所設計。 更新具體化檢視的延遲為秒或分鐘,而不是毫秒。
- 並非所有計算都可以以累加方式計算。
- Azure Databricks 嘗試偵測在實體化檢視中使用的 UDF 行為變化時,並執行完整刷新以套用更新後的 UDF。 然而,呼叫其他函式或函式庫的 UDF 可能會以 Azure Databricks 無法辨識的方式改變行為。 其中一個例子是當所呼叫的程式庫被更新時。 當 UDF 的行為改變時,你有責任對任何使用該 UDF 的具體化視圖進行完整刷新。
- 具體化檢視不支援
CLONE。 你不能用物質化視角作為深度或淺層複製的來源或目標。 如需詳細資訊,請參閱限制。 - 若要查看實體化檢視所依賴的管線,非管理員使用者除了需要有該管線的權限外,還需要具備該實體化檢視上的
REFRESH權限。 請參閱誰可以查看管線及其輸出?