Lakehouse および Delta Lake テーブル形式は Microsoft Fabric の中心であり、テーブルが分析用に最適化されていることを保証することが重要な要件です。 このガイドでは、Delta Lake テーブルの最適化の概念、構成、それを最も一般的なビッグ データの使用パターンに適用する方法について説明します。
V オーダーとは
V オーダーは、Parquet ファイル形式に対する書き込み時間の最適化であり、Power BI、SQL、Spark などの Microsoft Fabric コンピューティング エンジンでの高速読み取りを可能にします。
Power BI エンジンと SQL エンジンは、Microsoft Verti-Scan テクノロジーと V オーダー パーケットファイルを使用して、インメモリに匹敵するデータアクセス時間を実現します。 Spark やその他の Verti-Scan 以外のコンピューティング エンジンも、読み取り時間が平均 10% 速い V オーダー ファイルの恩恵を受け、一部のシナリオは最大 50% です。
V オーダーは、並べ替え、行グループの配布、エンコード、圧縮によって Parquet ファイルを最適化し、リソースの使用量を削減し、パフォーマンスとコスト効率を向上させます。 書き込み時間に最大 15% を追加しますが、最大 50%で圧縮を高めることができます。 V オーダーの並べ替えは、平均書き込み時間に 15% の影響を与えますが、最大 50% の圧縮を提供します。
オープンソースの Parquet 形式に 100% 準拠しています。すべての Parquet エンジンは、これを通常の Parquet ファイルとして読み込むことができます。 デルタ テーブルはこれまで以上に効率的です。Z オーダーなどの機能は V オーダーと互換性があります。 テーブルのプロパティと最適化コマンドを使用して、パーティションの V オーダーを制御できます。
V オーダーは、Parquet ファイル レベルで適用されます。 Delta テーブルおよび Z オーダー、圧縮、バキューム、タイム トラベルなどの機能は、V オーダーと直交しているため互換性があり、併用するとさらに利点があります。
V オーダー書き込みの制御
V オーダーは、特に読み取り負荷の高いシナリオで、クエリのパフォーマンスを向上させるために Parquet ファイル レイアウトを最適化するために使用されます。 Microsoft Fabric では、書き込み負荷の高いデータ エンジニアリング ワークロードのパフォーマンスを最適化するために、新しく作成されたすべてのワークスペースに対して V オーダーが既定で無効になっています。
Apache Spark での V オーダー動作は、次の構成によって制御されます。
| 構成 | デフォルト値 | 説明 |
|---|---|---|
spark.sql.parquet.vorder.default |
false |
セッション レベルの V オーダー書き込みを制御します。 新しい Fabric ワークスペースでは、既定で false に設定されます。 |
TBLPROPERTIES("delta.parquet.vorder.enabled") |
未設定 | テーブル レベルでの既定の V オーダー動作を制御します。 |
DataFrameのライターオプション: parquet.vorder.enabled |
未設定 | 書き込み操作レベルで V オーダーを制御するために使用されます。 |
次のコマンドを使用して、シナリオで必要に応じて V オーダー書き込みを有効またはオーバーライドします。
重要
データ インジェストと変換パイプラインのパフォーマンスを向上させるために、新しい Fabric ワークスペース () では V オーダーが
spark.sql.parquet.vorder.default=false。対話型クエリやダッシュボードなどの読み取り負荷が高いワークロードの場合は、次の構成で V-Order を有効にします。
- Spark プロパティの
spark.sql.parquet.vorder.defaultを true に設定します。 - リソース プロファイルを
readHeavyforSparkまたはReadHeavyプロファイルに切り替えます。 このプロファイルにより、V オーダーが自動的に有効になり、読み取りパフォーマンスが向上します。
- Spark プロパティの
Fabric ランタイム 1.3 以降のバージョンでは、 spark.sql.parquet.vorder.enable 設定は削除されます。 V オーダーは OPTIMIZE ステートメントを使用してデルタ最適化中に自動的に適用されるため、新しいランタイム バージョンでこの設定を手動で有効にする必要はありません。 以前のランタイム バージョンからコードを移行する場合は、エンジンによって自動的に処理されるようになったため、この設定を削除できます。
Apache Spark セッションで V オーダー構成を確認する
%%sql
SET spark.sql.parquet.vorder.default
Apache Spark セッションで V オーダー書き込みを無効にする
%%sql
SET spark.sql.parquet.vorder.default=FALSE
Apache Spark セッションで V オーダー書き込みを有効にする
重要
セッション レベルで有効になっている場合。 すべての Parquet 書き込みが V オーダー対応で行われます。これには、デルタ Parquet テーブル以外のテーブルと、 parquet.vorder.enabled テーブル プロパティが true または false に設定された Delta テーブルが含まれます。
%%sql
SET spark.sql.parquet.vorder.default=TRUE
Delta テーブルのプロパティを使用して V オーダーを制御する
テーブルの作成時に V オーダー テーブル プロパティを有効にする:
%%sql
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
重要
table プロパティが true に設定されている場合、INSERT、UPDATE、MERGE コマンドは想定どおりに動作し、書き込み時間の最適化を実行します。 V オーダー セッション構成が true に設定されている場合、または spark.write で有効になっている場合、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 オーダーを有効または無効にすると、テーブルへの今後の書き込みのみが影響を受けます。 Parquet ファイルは、作成時に使用される順序を維持します。 V オーダーを適用または削除するように現在の物理構造を変更するには、テーブルを 最適化するときに V オーダーを制御する方法を参照してください。
書き込み操作での V オーダーの直接制御
明示的でない場合、すべての 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 >= '2017-01-01' AND end_date <= '2017-01-31'")\
.saveAsTable("myschema.mytable")
重要
V オーダーは、述語の影響を受けるファイルのみに適用されます。
spark.sql.parquet.vorder.default が設定されていないセッションまたは false に設定されているセッションでは、次のコマンドは V オーダーを使用して書き込みます。
df_source.write\
.format("delta")\
.mode("overwrite")\
.option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-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()
書き込みの最適化とは
Apache Spark のようなビッグデータ処理エンジンの分析ワークロードは、標準化されたより大きなサイズのファイルを使用したときに最も効率的に実行されます。 ファイル サイズ、ファイル数、Spark ワーカーの数、およびその構成の間の関係は、パフォーマンスに大きく影響します。 データレイクテーブルへのデータの取り込みは、絶えず多くの小さなファイルを書き込むというしがちな特性があります。このシナリオは一般的に「スモールファイル問題」として知られています。
書き込みの最適化は、Apache Spark での書き込み中にファイル数を減らし、個々のファイル サイズを増やす、Fabric と Synapse の Delta Lake 機能です。 対象ファイルのサイズは構成を使用して、ワークロード要件ごとに変更できます。
この機能は、Microsoft Fabric Runtime for Apache Spark で既定で有効になっています。 書き込みの最適化の使用シナリオの詳細については、「Apache Spark での書き込みの最適化の必要性」の記事を参照してください
マージの最適化
Delta Lake の MERGE コマンドを使用すると、ユーザーは高度な条件で Delta テーブルを更新できます。 ソース テーブル、ビュー、または DataFrame からターゲット テーブルにデータを更新するには、MERGE コマンドを使用します。 ただし、Delta Lake のオープンソース ディストリビューションの現在のアルゴリズムは、未変更の行を処理できるように完全には最適化されていません。 Microsoft Spark Delta チームは、カスタムの Low Shuffle Merge 最適化を実装しました。未変更の行は、一致した行の更新に必要な高価なシャッフル操作から除外されます。
実装はspark.microsoft.delta.merge.lowShuffle.enabled構成によって制御され、ランタイムでは既定で有効になります。 コードの変更は必要なく、Delta Lake のオープンソース ディストリビューションと完全な互換性があります。 Low Shuffle Merge の使用シナリオの詳細については、「デルタ テーブルでの Low Shuffle Merge 最適化」の記事を参照してください
デルタ テーブルのメンテナンス
デルタ テーブルが変更されると、次の理由によりパフォーマンスとストレージのコスト効率が低下する傾向があります。
- テーブルに追加された新規データはデータを歪ませる可能性があります。
- バッチおよびストリーミング データの取り込み率により、多数の小さなファイルが取り込まれる可能性があります。
- 更新操作と削除操作では、読み取りオーバーヘッドが増加します。 Parquet ファイルは設計上変更できません。デルタ テーブルは変更セットを使用して新しい Parquet ファイルを追加するため、最初の 2 つの項目によって課される問題をさらに増幅します。
- 不要になったデータ ファイルとログ ファイルはストレージ内で利用可能になります。
テーブルを最適な状態に保ち、最高のパフォーマンスを実現するには、デルタ テーブルで Bin 圧縮およびバキューム操作を実行します。 バイン圧縮は OPTIMIZE コマンドによって実現されます。そして、すべての変更をより大きな統合 Parquet ファイルにマージします。 逆参照ストレージのクリーンアップは、VACUUM コマンドによって実行されます。
テーブル管理コマンド OPTIMIZE と VACUUM をノートブックおよび Spark Job Definitions 内で使用してから、プラットフォーム機能を用いて組織化できます。 「Delta Lake テーブル管理」の記事で説明したとおり、Fabric のレイクハウスでは、ユーザー インターフェイスを使用してアドホックのテーブル管理を行うことができます。
重要
インジェストの頻度と読み取りパターンに基づいてテーブルの物理構造を設計することは、多くの場合、このセクションの最適化コマンドよりも重要です。
テーブルを最適化するときに V オーダーを制御する
次のコマンド構造は、TBLPROPERTIES 設定やセッション構成設定とは関係なく、V オーダーを使用して影響を受けるすべてのファイルを Bin 圧縮し、再書き込みします。
%%sql
OPTIMIZE <table|fileOrFolderPath> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER BY (col_name1, col_name2, ...)] VORDER;
ZORDER と VORDER を一緒に使用すると、Apache Spark は Bin 圧縮、ZORDER、VORDER を順番に実行します。
次のコマンドは、TBLPROPERTIES 設定を使用して、影響を受けるすべてのファイルを Bin 圧縮し、再書き込みします。 TBLPROPERTIES が V オーダー に対して true に設定されている場合、影響を受けるすべてのファイルは V オーダーとして書き込まれます。 TBLPROPERTIES が設定されていないか false に設定されている場合、セッション設定が継承されます。 テーブルから V-Order を削除するには、セッション構成を false に設定します。
%%sql
OPTIMIZE <table|fileOrFolderPath>;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];