次の方法で共有


Delta テーブル データ ファイルのサイズを調整する

適切なサイズのファイルは、クエリのパフォーマンス、リソース使用率、およびメタデータ管理に重要です。 ファイルが小さいと、タスクのオーバーヘッドとメタデータ操作が増加しますが、大きなファイルでは並列処理とスキュー I/O が過小使用される可能性があります。 Delta Lake では、パーティションの排除とデータのスキップにファイル メタデータが使用されるため、適切なファイル サイズをターゲットにすることで、効率的な読み取り、書き込み、メンテナンスが保証されます。

使用シナリオ別のファイル サイズの推奨事項 (SQL Analytics エンドポイント、Power BI Direct Lake、Spark) については、 ワークロード間のテーブルのメンテナンスと最適化に関するページを参照してください。

次のセクションでは、Delta テーブルのファイル サイズを調整するために使用できる主な機能について説明します。

調整可能なデータ レイアウト操作

Optimize

OPTIMIZE コマンドは、Delta テーブル内のデータのレイアウトを改善するために、小さなファイルを大きなファイルとして書き換えます。 ファイル サイズのチューニング情報などの詳細については、 OPTIMIZE コマンド のドキュメントを参照してください。

自動圧縮

自動圧縮では、書き込み操作のたびにパーティションの正常性が自動的に評価されます。 パーティション内の過剰なファイル断片化 (小さなファイルが多すぎる) を検出すると、書き込みがコミットされた直後に同期 OPTIMIZE 操作がトリガーされます。 圧縮はプログラムによって有益であると判断された場合にのみ実行されるため、ファイルメンテナンスに対するこのライター駆動型アプローチは一般的に最適です。 詳細な構成オプションと追加情報については、 自動圧縮 のドキュメントを参照してください。

書き込みの最適化

書き込みの最適化は、事前に「bin パッキング」手法で書き込みを圧縮し、小さなファイル関連のオーバーヘッドを削減することで、生成されるファイルをより少数で大きなものにします。 この方法では、Spark が Parquet ファイルを書き込む前にメモリ内のデータを最適なサイズのビンにシャッフルし、書き込み後のクリーンアップ操作をすぐに必要とせずに適切なサイズのファイルを生成する可能性を最大化します。

書き込みの最適化を選択的に活用してください。 シャッフルでは、一部の書き込みパスに不要な処理時間が追加される可能性があります。 書き込みの最適化は、書き込みが後で圧縮を必要とする多数の小さなファイルを作成する場合に最も役立ちます。

書き込みの最適化の結果、書き込まれるファイルが少なくなる様子を示すスクリーンショット。

書き込みの最適化は、次の場合に一般的に役立ちます。

  • パーティション化されたテーブル
  • 小さな挿入が頻繁に行われるテーブル
  • 多くのファイル (MERGEUPDATEDELETE) に触れる可能性が高い操作

特定のテーブルに対する選択的なアプリケーションの場合は、セッション構成の設定を解除し、table プロパティを個別に有効にします。 これにより、各テーブルは、書き込みの最適化を適用するかどうかを制御できます。

  1. 書き込みの最適化の設定を解除する

    spark.conf.unset("spark.databricks.delta.optimizeWrite.enabled")
    
  2. 個々のテーブルで有効にする

    ALTER TABLE dbo.table_name
    SET TBLPROPERTIES ('delta.autoOptimize.optimizeWrite' = 'true')
    

Spark セッション内のすべてのパーティション テーブルへの書き込みの最適化書き込みを有効にするには、セッション構成が設定されていないことを確認してから、 spark.microsoft.delta.optimizeWrite.partitioned.enabled設定します。

SET spark.microsoft.delta.optimizeWrite.partitioned.enabled = TRUE

最適化書き込みから生成されるターゲット ファイル サイズは、 spark.databricks.delta.optimizeWrite.binSize 構成を使用して調整できます。

リソース プロファイル別の既定の書き込み設定の最適化については、リソース プロファイルを参照してください。

ターゲット ファイルのサイズを一貫して設定する

最適化、自動圧縮、書き込みの最適化のためにファイル サイズの最小と最大のセッション構成を個別に設定しないようにするには、 delta.targetFileSize テーブル プロパティを使用します。 このプロパティは、テーブル レベルでのファイル サイズの動作を統合します。 値をバイト文字列として指定します (たとえば、 1073741824b1048576k1024m1g)。 設定すると、セッション構成とアダプティブ ターゲット ファイル サイズよりも優先されます。

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.targetFileSize' = '256m')

アダプティブ ターゲット ファイルのサイズ

Microsoft Fabric では、 delta.targetFileSize テーブル プロパティを使用して、セッション内のすべてのテーブルまたは個々のテーブルのターゲット ファイル サイズを手動で調整する場合に関連する複雑さを排除するために、アダプティブ ターゲット ファイル サイズを提供します。 アダプティブ ターゲット ファイル サイズでは、テーブル サイズなどの Delta テーブル ヒューリスティックを使用して理想的なターゲット ファイル サイズを推定し、条件の変化に応じてターゲットを自動的に更新し、手動による介入やメンテナンスのオーバーヘッドなしで最適なパフォーマンスを確保します。

アダプティブ ターゲット ファイル サイズを有効にする

現在、既定では有効になっていませんが、 アダプティブ ターゲット ファイル サイズ セッション構成を有効にすることをお勧めします。

次の Spark セッション構成を設定して、Spark セッション内で作成または変更されたテーブルでアダプティブ ターゲット ファイル サイズを有効にします。

SET spark.microsoft.delta.targetFileSize.adaptive.enabled = TRUE

評価動作を理解する

有効にすると、アダプティブ ターゲット ファイル サイズが評価され、次のシナリオで設定されます。

  • CREATE TABLE AS SELECT 操作と CREATE OR REPLACE TABLE AS SELECT 操作
  • 上書き書き込み (例: DataFrame.write.mode("overwrite")INSERT OVERWRITE)
  • 新しいテーブルを作成するときに、 ErrorIfExistsAppend、または Ignore モードで書き込みます
  • OPTIMIZE コマンドの開始時

設定すると、すべての OPTIMIZE 操作の開始時に理想的なサイズが再評価され続け、現在のヒューリスティックに最新のデータ分布とテーブルの増加が確実に反映されるようになります。 このアダプティブ アプローチでは、時間の経過と同時にターゲット ファイルのサイズが自動的に更新されるため、データの増加に合わせてクエリと書き込みのパフォーマンスを維持しながら、手動でチューニングする必要がなくなります。 ハイパーチューニングやテストのユース ケースなど、特定のサイズでロックする必要がある場合は、ユーザー定義 delta.targetFileSize テーブル プロパティを明示的に設定することで、アダプティブ設定をオーバーライドできます。

アダプティブ ターゲット ファイル サイズの境界を調整する

アダプティブ ターゲット ファイル サイズは、次の Spark セッション構成を使用してさらに構成できます。

プロパティ Description デフォルト値 セッション構成
minFileSize アダプティブ ターゲット ファイル サイズが評価時に使用するバイト文字列として、最小ファイル サイズ (下限) を指定します。 128 MB から 1 GB の間である必要があります。 128m spark.microsoft.delta.targetFileSize.adaptive.minFileSize
maxFileSize アダプティブ ターゲット ファイル サイズが評価時に使用するバイト文字列として最大ファイル サイズ (上限) を指定します。 128 MB から 1 GB の間である必要があります。 1024m spark.microsoft.delta.targetFileSize.adaptive.maxFileSize
stopAtMaxSize trueすると、計算されたターゲット ファイル サイズがmaxFileSizeに達すると、さらにサイズの評価が停止され、非常に大きなテーブルの評価オーバーヘッドが軽減されます。 true spark.microsoft.delta.targetFileSize.adaptive.stopAtMaxSize

stopAtMaxSizeが有効になっている場合 (既定値)、アダプティブ ターゲット サイズは最大値に達した後も固定され、追加の計算が回避されます。 拡大後にテーブルが縮小する可能性がある場合は、このプロパティを false に設定して、最大しきい値を下回る再計算を許可します。

評価されたターゲット サイズを検査する

DESCRIBE DETAILまたはDESCRIBE EXTENDEDからテーブルの詳細とプロパティを調べることで、評価されたアダプティブ ターゲット ファイル サイズを監査できます。 評価された値は、 delta.targetFileSize.adaptive テーブル プロパティにバイト文字列として書き込まれます。

この値は、最適化、自動圧縮、および書き込みの最適化のターゲット (または最大) サイズとして使用されます。 関連する最小値は、 delta.targetFileSize.adaptiveの半分として計算されます。

パフォーマンスへの影響を理解する

次の表は、テーブル サイズと最適な Parquet ファイル サイズの関係を示しています。 10 GB 未満のテーブルの場合、Fabric Spark ランタイムはターゲット ファイル サイズを 128 MB に評価します。 テーブル サイズが大きくなると、ターゲット ファイル のサイズは直線的にスケーリングされ、10 TB を超えるテーブルでは最大 1 GB に達します。

テーブル サイズと最適な Parquet ファイル サイズの関係を示すグラフ。

小さい 128 MB から始めてから、テーブルのサイズが大きくなるにつれて Parquet ファイルのサイズをスケーリングすると、次のような利点があります。

  • デルタ ファイルのスキップの改善: 適切なサイズのファイルは最適なデータ クラスタリングとスキップをサポートするため、Delta のファイル スキップ プロトコルにより、クエリの実行中に無関係なファイルを排除できます。 1 GB ファイルではなく 128 MB のファイルを含む小さなテーブルを使用すると、8 倍のファイルスキップが可能になります。

  • 更新コストの削減: MERGE 操作と UPDATE 操作は、影響を受けるファイルのみを書き換えます。 適切なサイズのファイルは、操作ごとにタッチされるファイルの数を最小限に抑え、書き換えられたデータの量を減らします。 削除ベクターを有効にすると、十分なファイルサイズ設定が重要になります。大きすぎるファイルの行レベルの墓石は、圧縮または削除操作中に大幅なクリーンアップコストが発生します。

  • 最適化された並列処理: 適切なサイズのファイルを使用すると、Spark で理想的なタスクの並列処理を実現できます。 小さなファイルが多すぎるとスケジューラが圧倒されます。大きなファイルが少なすぎると、Spark プールの使用率が低くなります。 最適なサイズ設定により、読み取りと書き込みの両方のスループットが最大化されます。

アダプティブ ターゲット ファイル サイズでは、既定の構成よりも適切なサイズを選択すると、圧縮のパフォーマンスとクエリ/書き込みの待機時間が向上します。 アダプティブ評価で既定の Spark セッション構成と同じサイズが生成される場合、測定可能な改善は期待されません。

Important

書き込み増幅は、以前に圧縮されたファイルが時間の経過と同時にターゲット ファイル サイズの増加に伴って書き換えられたときに発生します。 このリスクを軽減するには、 ファイル レベルの圧縮ターゲット (spark.microsoft.delta.optimize.fileLevelTarget.enabled=true) を有効にします。 この設定は、以前のターゲット サイズで既に圧縮されているファイルの不要な再計算をスキップすることで、以前の圧縮作業を維持するのに役立ちます。 詳細については、 ファイル レベルの圧縮ターゲットを参照してください

ベスト プラクティスの概要

これらの推奨事項を使用して、テーブルの増加に応じて、書き込みコスト、読み取りパフォーマンス、およびメンテナンスのオーバーヘッドのバランスを取ります。

  • 頻繁に小さな書き込み (ストリーミングまたはマイクロバッチ) を行うインジェスト パイプラインに対して自動圧縮を有効にして、手動スケジュールなしでファイルの正常性を維持します。
  • 自動圧縮は、サービス レベルの目標が書き込み待機時間の急増を許容できる場合に、他の書き込みパターンに対して選択的に使用します。
  • アダプティブ ターゲット ファイル サイズを有効に して、手動チューニングを減らし、ターゲット サイズをテーブルの拡大に合わせて維持します。
  • 制御されたインジェスト パス (シャッフル、パーティション分割された書き込み、または頻繁な小さな書き込みを許容できるバッチ ジョブ) で書き込みの最適化を使用して、ダウンストリームの圧縮の負荷を軽減します。
  • 多数のパーティションを書き換えたり、Z オーダーを適用したりする必要がある場合は、OPTIMIZEをスケジュールします。
  • 高速最適化を有効にして書き込みの増幅を減らし、OPTIMIZE をべき等性にします。 高速最適化を参照してください。
  • delta.targetFileSizeまたはアダプティブ ターゲット ファイル サイズを一貫して使用して、互換性のあるファイル サイズの目標に合わせて最適化、自動圧縮、書き込みのコンバージを最適化します。
  • ファイル レベルの圧縮ターゲットを有効に して、ターゲット ファイル サイズが時間の経過と同時に増加するにつれて、不要な再計算を減らします。