メインコンテンツまでスキップ

レイクハウスフェデレーションのパフォーマンスに関する推奨事項

この記事では、レイクハウスフェデレーション クエリのパフォーマンスを向上させるためのガイダンスを提供します。

AND演算子を使用して複数の述部を結合する

Databricks Runtime は、述語をリモート データベース エンジンにプッシュダウンして、ネットワーク経由でフェッチされるレコードの数を減らそうとします。述部をプッシュダウンできない場合、リモート・データベース・エンジンで実行されるクエリは、その述部 ( そのため、フィルタリングはDatabricks Runtimeを使用して行う必要があります。ただし、フィルターの特定の部分を押し下げることができない場合でも、フィルターの別の部分が AND 演算子で結合されていれば、押し下げることができます。

例1:

Databricks クエリ

SQL
SELECT * FROM foreign_catalog.schema.table WHERE name ILIKE 'john'

適切な変換がないため、 ILIKE 式をリモートデータベース (MySQL など) にプッシュダウンできません。フィルタリングは、Databricks Runtime を使用して行う必要があります。

リモート・データベースに送信されるクエリは、すべてのレコードを返します。

SQL
SELECT * FROM catalog.schema.table

例2:

Databricks クエリ

SQL
SELECT * FROM foreign_catalog.schema.table WHERE name ILIKE 'john' AND date > '2025-05-01'

適切な変換がないため、 ILIKE 式をリモート・データベース (MySQL など) にプッシュ・ダウンすることはできませんが、日付の比較は可能です。名前のフィルタリングは、引き続きDatabricks Runtimeを使用して行う必要がありますが、日付の比較により、フェッチされるレコードの数を減らす必要があります。

リモート・データベースに送信されるクエリは、レコードのサブセットを返します。

SQL
SELECT * FROM catalog.schema.table WHERE date > '2025-05-01'

リモート・データベースで実行するクエリを確認します

EXPLAIN FORMATTED コマンドを使用して、どのクエリがリモート・データベースに送信されるかを確認できます。

備考

実際のクエリは、 アダプティブ クエリの実行により、explain コマンド出力のクエリと異なる場合があります。

リモート・データベースからフェッチされるバッチのサイズを設定します

JDBC 転送プロトコルを使用するコネクターは、リモート・システムからデータをフェッチする方法を制御するように構成できます。

  • Databricks
  • Microsoft SQL Server
  • Microsoft Azure Synapse
  • MySQL
  • Oracle
  • PostgreSQL
  • Redshift
  • Salesforce データクラウド
  • テラデータ

JDBC フェッチ・サイズは、ラウンド・トリップごとにフェッチするロー数を決定します。デフォルトでは、ほとんどの JDBC コネクターはデータをアトミックにフェッチします。これにより、データ量が使用可能なメモリを超える可能性があります。

メモリ不足エラーを回避するには、 fetchSize パラメーターを設定します。 fetchSize が 0 以外の値に設定されている場合、コネクタはデータをバッチで読み取ります。バッチあたりの最大行数は、 fetchSizeの値と等しくなります。Databricks では、バッチ内の行数が少なすぎるとクエリ全体の実行時間が長くなる可能性があるため、大きな fetchSize 値 ( 100,000など) を指定することをお勧めします。

このパラメーターを使用すると、ワーカー ノードはデータをバッチで読み取ることができますが、並列で読み取ることはできません。

コンピュートの要件:

  • コンピュートは Databricks Runtime 16.1以上で使用する必要があります。 SQLウェアハウスは Pro または サーバレスで、2024.50 を使用する必要があります。
SQL
SELECT * FROM mySqlCatalog.schema.table WITH ('fetchSize' 100000)

パーティション サイズ パラメーター (Snowflake) を設定します

Snowflakeでは、複数のパーティションでデータをフェッチできるため、複数のエグゼキューターのエンゲージメントと並列処理が可能になります。partition_size_in_mb パラメーターを設定して、適切なパーティション サイズを選択することが重要です。このパラメーターは、各パーティションの推奨非圧縮サイズを指定します。 パーティションの数を減らすには、より大きな値を指定します。デフォルト値は 100 (MB) です。

partition_size_in_mb パラメーターは、推奨されるサイズを設定します。パーティションの実際のサイズは異なる場合があります。

コンピュートの要件:

  • コンピュートは Databricks Runtime 16.1以上で使用する必要があります。 SQLウェアハウスは Pro または サーバレスで、2024.50 を使用する必要があります。
SQL
SELECT * FROM snowflakeCatalog.schema.table WITH ('partition_size_in_mb' 1000)

JDBC コネクタの並列読み取りを有効にする

JDBC 転送プロトコルをサポートするコネクタは、クエリをパーティション化することでデータを並列に読み取ることができます。次のコネクタの並列読み取りを構成できます。

  • Databricks
  • Microsoft SQL Server
  • Microsoft Azure Synapse
  • MySQL
  • Oracle
  • PostgreSQL
  • Redshift
  • Salesforce データクラウド
  • テラデータ

これにより、複数のエグゼキューターが同時にデータをフェッチできるようになり、大規模なテーブルのパフォーマンスが大幅に向上します。

並列読み取りを有効にするには、次のパラメーターを指定します。

  • numPartitions: 並列処理に使用するパーティションの数
  • partitionColumn: クエリのパーティション分割に使用される数値列の名前
  • lowerBound: パーティションストライドの決定に使用される partitionColumn の最小値
  • upperBound: パーティションストライドの決定に使用される partitionColumn の最大値
備考

lowerBound 値と upperBound 値は、パーティションのストライドを決定するためにのみ使用され、テーブル内の行をフィルタリングするためには使用されません。テーブル内のすべての行がパーティション分割され、返されます。

パーティション列は次のようになります。

  • 数値列
  • 範囲全体に均等に分布
  • パフォーマンスを向上させるためのインデックス付き列

コンピュートの要件:

  • コンピュートは Databricks Runtime 17.1以降で使用する必要があります。 SQLウェアハウスはproまたはサーバレスで、2025.25を使用する必要があります。

次の例では、クエリは id 列に基づいて 4 つの並列パーティションに分割され、各パーティションは約 250 個の ID の範囲を処理します (1 から 1000までの各idに 1 つのレコードがあると仮定します)。

SQL
SELECT * FROM mySqlCatalog.schema.table WITH (
'numPartitions' 4,
'partitionColumn' 'id',
'lowerBound' 1,
'upperBound' 1000
)