使用 V-Order 優化三角洲湖表

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

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

利用本文:

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

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

什麼是 V 順序?

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

一覽:

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

控制 V-Order 寫入操作

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

Apache Spark 中的 V 順序行為是透過下列的設定來進行控制:

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

使用下列命令,根據您的情境需求啟用或覆寫 V 順序寫入。

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

對於大量讀取的工作負載,如互動式查詢或儀表板,請透過設定 spark.sql.parquet.vorder.defaulttrue來啟用 V-Order。 你也可以切換到 readHeavyforSparkReadHeavy 資源設定檔,這會自動啟用 V-Order 以提升以讀取為中心的效能。

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

檢查 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-Order 寫入

當你在會話層級啟用 V-Order 時,該會話中所有 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 順序資料表屬性:

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

當資料表屬性設定為 trueINSERTUPDATEMERGE 時,在寫入時應用 V-Order。 會話層級與寫入層級的設定仍優先,因此即使 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-Order,請閱讀 Table compaction

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

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

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

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

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 順序僅適用於受謂詞影響的檔案。

在一個會話中,當spark.sql.parquet.vorder.default未設定或設為false時,以下指令使用 V-Order 寫入:

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()