Lakehouse および Delta Lake テーブル形式は、Microsoft Fabricの中心です。 デルタ テーブルを最適化しておくことは、分析ワークロードのパフォーマンスとコスト効率の鍵となります。
この記事では、V-オーダーを使うタイミングを判断し、デルタテーブルの主な構成と保守パターンを示します。
この記事を使用して、次の操作を行います。
- V-オーダーが何を変え、いつ効果があるのかを理解しましょう。
- ZオーダーとVオーダーがどのように補完し合うかを理解しましょう。
- 適切な制御レベル (セッション、テーブル プロパティ、または書き込み操作) を選択します。
- 適切な Spark ランタイム コンテキストで Delta テーブルのメンテナンス パターンを適用します。
消費シナリオに基づくV-orderの適用タイミングに関するクロスワークロードガイダンスについては、 クロスワークロードテーブルのメンテナンスと最適化を参照してください。
V-オーダーとは何ですか?
V-orderはParquetファイルの書き込み時最適化であり、Fabricエンジン全体での下流クエリ性能を向上させることができます。
一目でわかる
- 最も役に立つ場所: ダッシュボード、対話型分析、繰り返しスキャンなどの読み取り負荷の高いパターン。
- それがどのように役立つのか: Parquet レイアウト (行グループの配布、エンコード、圧縮など) を再構成して、読み取り効率を向上させます。
- 一般的なトレードオフ: 書き込みには時間がかかる場合があります (多くの場合、平均で約 15%)。一方、読み取りはワークロードに応じて大幅に向上します。
- エンジンの互換性: ファイルはオープンソースの Parquet に準拠したままであり、Z オーダーなどのデルタ機能には互換性があります。
- 範囲: V-オーダーはファイルレベルです。 圧縮、真空、タイムトラベルなどのデルタ操作を使用できます。
制御Vオーダーの書き込み
Vオーダーは、特に読み込みが多い状況で、Parquetファイルのレイアウトを最適化し、より高速なクエリ性能を実現します。 Fabricでは、書き込みが多いデータエンジニアリングワークロードに対してパフォーマンス最適化のために、新たに作成されたすべてのワークスペースでV-orderがデフォルトで無効化されています。
Apache SparkにおけるVオーダーの挙動は、以下の構成によって制御されます:
| 構成 | デフォルト値 | 説明 |
|---|---|---|
spark.sql.parquet.vorder.default |
false |
セッションレベルのVオーダー書き込みを制御します。 新しい Fabric ワークスペースでは、既定で false に設定されます。 |
TBLPROPERTIES("delta.parquet.vorder.enabled") |
未設定 | テーブルレベルでデフォルトのV-オーダー動作を制御します。 |
DataFrameのライターオプション: parquet.vorder.enabled |
未設定 | 書き込み操作レベルでVオーダーを制御するために使用されました。 |
シナリオに応じて、以下のコマンドを使ってV-order書き込みを有効化またはオーバーライドしてください。
新しいFabricワークスペース(spark.sql.parquet.vorder.default=false)では、取り込みおよび変換パイプラインの書き込み性能を向上させるために、V-orderはデフォルトで無効化されています。
インタラクティブなクエリやダッシュボード作成など読み込み負荷が多いワークロードでは、 spark.sql.parquet.vorder.default を trueに設定してV-orderを有効にします。 また、リソースプロファイル readHeavyforSpark や ReadHeavy リソースプロファイルに切り替えることも可能で、これにより自動的にVオーダーを有効にしてリードフォーカス性能を実現できます。
Fabric ランタイム 1.3 以降では、 spark.sql.parquet.vorder.enable 設定は削除されます。 Vオーダーは OPTIMIZEでデルタ最適化中に自動的に適用できるため、この古い設定は不要です。 以前のランタイム バージョンから移行する場合は、コードからこの設定を削除します。
Apache SparkセッションでV-order設定を確認してください
変更する前に、次のコマンドを使用して現在のセッション値を確認します。
Apache SparkセッションでVオーダー書き込みを無効にする
ワークロードが書き込み負荷が高く、インジェストまたは変換の書き込みを高速化する場合は、次のコマンドを使用します。
Apache SparkセッションでVオーダー書き込みを有効にする
セッションレベルでV-orderを有効にすると、そのセッション内のすべてのParquet書き込みはV-orderを使用します。非Delta Parquetテーブルや、parquet.vorder.enabledに設定されていてもDeltaテーブルも含まれますfalse。
デルタテーブルプロパティを用いた制御V次数
このセクションでは、テーブルのプロパティが SQL DDL ステートメントと ALTER TABLE ステートメントを使用して定義されているため、Spark SQL のみを使用します。
複数のセッションに適用されるテーブル レベルの既定値が必要な場合は、テーブルプロパティを使用します。
テーブル作成時にV-orderテーブルプロパティを有効にする:
%%sql
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
テーブルプロパティが trueに設定されている場合、 INSERT、 UPDATE、 MERGE 書き込み時にVオーダーを適用します。 セッションレベルおよび書き込みレベルの設定が優先されるため、 TBLPROPERTIES が falseに設定されていても書き込みはVオーダーを使用できます。
テーブルプロパティを変更してVオーダーを有効化または無効化します:
%%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 ライター 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オーダーは述語の影響を受けるファイルにのみ適用されます。
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()