利用 V 階優化三角洲湖表

LakehouseDelta Lake表格是Microsoft Fabric的核心。 保持 Delta 表格的最佳化是分析工作負載效能與成本效益的關鍵。

本文將協助你決定何時使用 V-order,並說明 Delta 表格的主要配置與維護模式。

利用本文:

  • 了解V-order會改變什麼,以及它什麼時候有效。
  • 了解 Z 階和 V 階如何互補。
  • 選擇正確的控制層級:會話、資料表屬性或寫入操作。
  • 在正確的 Spark 執行環境中套用 Delta 表格維護模式。

關於根據消耗情境何時應用 V 命令的跨工作負載指引,請參見 跨工作負載表維護與優化

什麼是V-order?

V-order 是一種針對 Parquet 檔案的寫入時間優化,能提升跨 Fabric 引擎的下游查詢效能。

一覽:

  • 最有幫助的地方:以大量閱讀為主的模式,如儀表板、互動式分析和重複掃描。
  • 功能說明: 重新組織 Parquet 佈局(例如列分群分布、編碼與壓縮),以提升讀取效率。
  • 典型的取捨: 寫入可能需要較長時間(平均約15%),而讀取則會根據工作負載大幅改善。
  • 引擎相容性: 檔案仍維持開源 Parquet 相容性,且 Delta 功能如 Z-Order 仍維持相容性。
  • 範圍: V-order 是檔案層級的。 可使用壓縮、真空和時間旅行等三角洲運算。

控制 V 順序寫入

V-order 用於優化 Parquet 檔案的配置,以提升查詢效能,特別是在讀取量大的情境下。 在 Fabric 中,所有新建立的工作區預設會停用 V-order,以優化對寫入量大的資料工程工作負載的效能。

Apache Spark 中的 V 命令行為透過以下配置來控制:

組態 預設值 說明
spark.sql.parquet.vorder.default false 控制會話層級的V指令撰寫。 在新的 Fabric 工作區中,預設為 false
TBLPROPERTIES("delta.parquet.vorder.enabled") 未設定 控制桌面層級預設的 V-order 行為。
DataFrame 寫入器選項: parquet.vorder.enabled 未設定 用於在寫入操作層級控制 V 順序。

根據你的情境,請使用以下指令啟用或覆寫 V-order 寫入。

在新的 Fabric 工作區中spark.sql.parquet.vorder.default=false預設關閉 V-order,以提升擷取與轉換管線的寫入效能。

對於閱讀量大的工作負載,如互動式查詢或儀表板,請透過設定 spark.sql.parquet.vorder.defaulttrue來啟用 V-order。 你也可以切換到 readHeavyforSpark 或 資源 ReadHeavy 設定檔,這些設定檔會自動啟用 V 順序,以提升閱讀聚焦效能。

在 Fabric 執行 1.3 及之後版本中,該 spark.sql.parquet.vorder.enable 設定被移除。 因為 V 階數可以在 Delta 優化時自動套用,你 OPTIMIZE不需要這個舊設定。 如果你是從較早的執行版本遷移過來,請從程式碼中移除這個設定。

檢查 Apache Spark 會話中的 V-order 設定

在更改之前,請使用這些指令確認目前的會話值。

%%sql 
SET spark.sql.parquet.vorder.default 

在 Apache Spark 會話中停用 V 命令寫入

當你的工作負載寫入量大,想要更快的擷取或轉換寫入時,可以使用這些指令。

%%sql 
SET spark.sql.parquet.vorder.default=FALSE 

在 Apache Spark 會話中啟用 V 命令寫入

當你在會話層級啟用 V 順序時,該會話中的所有 Parquet 寫入都會使用 V-order,包括非 Delta Parquet 資料表及即使 parquet.vorder.enabled 明確設定為 false的 Delta 資料表。

%%sql 
SET spark.sql.parquet.vorder.default=TRUE 

利用 Delta 表性質進行控制 V 階

本節使用 Spark SQL 僅是因為資料表屬性是透過 SQL DDL 和 ALTER TABLE 語句定義的。

當你想要一個跨工作階段的表格層級預設值時,可以使用表格屬性。

在建立資料表時啟用 V-order 資料表屬性:

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

當表格屬性設定為 trueINSERTUPDATE、 並 MERGE 於寫入時套用 V 順序。 會話層級與寫入層級設定仍優先,因此即使 TBLPROPERTIES 設定為 false,寫入仍可使用 V-order。

透過修改表格屬性來啟用或停用 V-order:

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

啟用或停用 V-order 後,使用資料表屬性,只有未來對資料表的寫入會受到影響。 Parquet 檔案會保留當檔案被建立時的排序。 若要更改目前的物理結構以套用或移除 V 階,請閱讀 Table compaction

直接控制寫入操作中的 V 順序

本節使用 PySpark 來示範 DataFrame writer API。 Scala DataFrame API 也有相同模式,並提供等效選項。

當你需要針對每個操作進行控制時,請使用寫入層級的選項,而不是使用整個會話或整個資料表的預設值。

所有 Apache Spark 寫入指令在未明確覆寫時都會繼承會話設定。 以下範例是透過繼承會話配置來使用 V 順序撰寫。

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .saveAsTable("myschema.mytable") 

V-order 僅適用於受謂詞影響的檔案。

在一個 spark.sql.parquet.vorder.default 是 未設定或設定為 false的會話中,以下指令會使用 V 順序寫入:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .option("parquet.vorder.enabled","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()