クエリが大きなDelta Lakeテーブルを小さなフィルタリング済みテーブルと結合すると、そのフィルター値はクエリ実行までわかりません。 ランタイムのプルーニングがなければ、クエリは大きなテーブル内のすべてのファイルをスキャンし、一致する行がないファイルも含めてスキャンします。 動的ファイルプルーニングはこの問題を解決します。 実行時には、オプティマイザが結合の一方の側のフィルター結果をDelta Lakeテーブルのスキャンまでプッシュダウンし、一致する行を含まないファイルはスキップします。
動的ファイルプルーニングはデフォルトで有効になっています。 検索内容を変えなくても、その恩恵を受けられます。
動的ファイルの排除が適用される場合
動的ファイル剪定はDelta Lakeテーブル上のジョインにのみ適用されます。
MERGE ステートメントでは、マージ条件でソース列とターゲット列を比較して等価性を確認する際に、ソースの結合キー値を使用してターゲット ファイルをスキップします。
UPDATE ステートメントや DELETE ステートメントでは、条件に、同じ種類の比較を行うサブクエリが含まれている場合に適用されます。
MERGE、UPDATE、およびDELETEステートメントでの動的ファイルの排除には、Photon 対応のコンピューティングが必要です。
SELECT ステートメントの場合、Photon の動的ファイルの排除は、より広範で信頼性も高くなっています。 Photonを使用しない場合、クエリの形状や実行計画によっては、動的ファイル剪定が SELECT 文にも適用される場合があります。 「Photon とは」を参照してください。
動的ファイルプルーニングは、パーティション化されていないテーブルや非パーティション列上の結合で、パフォーマンスを最も向上させます。 デフォルトでは、ジョイン内の大きなDelta Lakeテーブルが少なくとも10GBで、ファイル数が10つ以上ある場合にのみトリガーされます。 構成に関するページを参照してください。
動的ファイルプルーニングは書き込みの競合も減らします。 Delta Lake がコミット中に競合をチェックする際、動的ファイルの排除でスキップされたファイルも考慮します。 これにより失敗した取引の数が減ります。 分離レベルと書き込みの競合を参照してください。
ベスト プラクティス
動的ファイルプルーニングのパフォーマンス効果は、データのクラスタリング方法と相関しています。 結合する値がすべてのファイルに分散している場合、動的ファイルの排除ではほとんどファイルをスキップしません。 動的ファイルプルーニングでより多くのファイルをスキップするために、以下の方法に従ってください:
- 頻繁に結合する列にはリキッド クラスタリングを使用して、一致する行がより少ないファイルに併置されるようにします。
- 動的ファイルの排除のために
MERGE、UPDATE、DELETEのステートメントで必要な、Photon 対応コンピューティングを使用します。
設定
ほとんどのワークロードはこれらの設定を変更する必要はありません。 小さなDelta Lakeテーブルとの結合が剪定の恩恵を受けるが、デフォルトのサイズやファイル数の閾値を下回る場合は閾値を調整することを検討してください。
これらのApache Sparkの設定プロパティは動的ファイルプルーニングを制御します:
| Property | タイプ | Default | Description |
|---|---|---|---|
spark.databricks.optimizer.dynamicFilePruning |
Boolean |
true |
動的ファイルの排除のオンとオフを切り替えます。 |
spark.databricks.optimizer.deltaTableSizeThreshold |
Long |
10000000000 (10 GB) |
動的ファイルプルーニングを引き起こすジョイン内の大きなDelta Lakeテーブルの最小サイズ(バイト単位)です。 小さいテーブルの場合、フィルターをプッシュダウンするよりもテーブル全体をスキャンする方が安いことが多いです。 Delta Lake テーブルのサイズを調べるには、 DESCRIBE DETAIL table_name を実行して sizeInBytes 列を確認してください。 |
spark.databricks.optimizer.deltaTableFilesThreshold |
Integer |
10 |
動的ファイルプルーニングをトリガーする結合内の大規模な Delta Lake テーブルにおける最小ファイル数。 テーブルのファイル数がこの閾値より少ない場合、動的ファイルプルーニングは実行されません。なぜなら、ファイルが少ないテーブルではあまり価値がないかもしれないからです。 デルタレイクテーブルのファイル数を調べるには、 DESCRIBE DETAIL table_name を実行して numFiles 列を確認してください。 |