コストベースの最適化

Prestoは、以下に説明するいくつかのコストベースの最適化をサポートしています。

結合の列挙

クエリで結合が実行される順序は、クエリの性能に大きな影響を与える可能性があります。結合の順序付けの中で、性能に最も大きな影響を与えるのは、処理されネットワーク経由で転送されるデータのサイズです。大量のデータを生成する結合が実行の初期段階で実行されると、後続のステージでは必要以上に大量のデータを長時間処理する必要が生じ、クエリに必要な時間とリソースが増加します。

コストベースの結合列挙では、Prestoはコネクタによって提供されるテーブル統計を使用して、異なる結合順序のコストを推定し、計算されたコストが最も低い結合順序を自動的に選択します。

結合列挙戦略は、join_reordering_strategyセッションプロパティによって制御され、optimizer.join-reordering-strategy設定プロパティがデフォルト値を提供します。

有効な値は次のとおりです。
  • AUTOMATIC (デフォルト) - 完全自動結合列挙が有効

  • ELIMINATE_CROSS_JOINS - 不要なクロス結合を排除

  • NONE - 純粋に構文的な結合順序

AUTOMATICを使用していて統計情報が利用できない場合、またはその他の理由でコストを計算できなかった場合は、代わりにELIMINATE_CROSS_JOINS戦略が使用されます。

結合分散の選択

Prestoはハッシュベースの結合アルゴリズムを使用します。これは、各結合演算子に対して、一方の結合入力(ビルド側と呼ばれる)からハッシュテーブルを作成する必要があることを意味します。もう一方の入力(プローブ側)は反復処理され、各行についてハッシュテーブルが照会されて一致する行が検索されます。

結合分散には2つのタイプがあります。
  • パーティション分割:クエリに参加している各ノードは、データの一部のみからハッシュテーブルを構築します。

  • ブロードキャスト:クエリに参加している各ノードは、すべてのデータからハッシュテーブルを構築します(データは各ノードに複製されます)。

それぞれのタイプにはトレードオフがあります。パーティション分割された結合では、結合キーのハッシュを使用して両方のテーブルを再配布する必要があります。これは、ブロードキャスト結合よりも遅くなる場合がありますが(場合によっては大幅に)、はるかに大きな結合が可能になります。特に、ビルド側がプローブ側よりもはるかに小さい場合、ブロードキャスト結合の方が高速になります。ただし、ブロードキャスト結合では、フィルタリング後の結合のビルド側のテーブルが各ノードのメモリに収まる必要がありますが、分散結合では、すべてのノードに分散されたメモリに収まる必要があります。

コストベースの結合分散選択では、Prestoはパーティション分割された結合を使用するか、ブロードキャスト結合を使用するかを自動的に選択します。コストベースの結合列挙とコストベースの結合分散の両方を使用すると、Prestoはプローブ側とビルド側を自動的に選択します。

結合分散タイプは、join_distribution_typeセッションプロパティによって制御され、join-distribution-type設定プロパティがデフォルト値を提供します。

有効な値は次のとおりです。
  • AUTOMATIC (デフォルト) - 結合分散タイプは結合ごとに自動的に決定されます

  • BROADCAST - すべての結合にブロードキャスト結合分散が使用されます

  • PARTITIONED - すべての結合にパーティション分割された結合分散が使用されます

複製テーブルサイズの制限

結合の並べ替え戦略がCOST_BASEDに設定されている場合、または結合分散タイプがAUTOMATICに設定されている場合、結合分散タイプは自動的に選択されます。このような場合、join-max-broadcast-table-size設定プロパティ(例:join-max-broadcast-table-size=100MB)またはjoin_max_broadcast_table_sizeセッションプロパティ(例:set session join_max_broadcast_table_size='100MB';)を介して複製テーブルの最大サイズを制限することができます。これにより、クラスタの同時実行性を向上させ、CBOが結合されたテーブルのサイズを誤って推定した場合に不適切なプランを防ぐことができます。

デフォルトでは、複製テーブルのサイズは100MBに制限されています。

コネクタの実装

Prestoオプティマイザがコストベースの戦略を使用するには、コネクタ実装がテーブル統計を提供する必要があります。