CTE マテリアライゼーション

共通テーブル式(CTE)は、ユーザーが提供する WITH 句に記述されるサブクエリです。クエリ内で繰り返し使用すると、冗長な計算、過剰なデータ取得、高いリソース消費につながる可能性があります。

これを解決するために、Presto は CTE マテリアライゼーションをサポートしており、同じクエリのスコープ内で中間 CTE を再利用できるようにしています。CTE をマテリアライズすると、同じ CTE がクエリ内で複数回使用される場合に、CTE の再計算を減らすことでパフォーマンスを向上させることができます。ただし、ディスクへの書き込みと読み取りにもコストがかかるため、非常に単純な CTE や、クエリ内で何度も使用されない CTE の場合、最適化のメリットがない場合があります。

マテリアライズされた CTE は、ランダムハッシュに基づいてバケット化された一時テーブルに格納されます。この機能を使用するには、クエリで使用するコネクターが一時テーブルの作成をサポートしている必要があります。現在、この機能を備えているのは Hive コネクター のみです。QueryStats (com.facebook.presto.spi.eventlistener.QueryStatistics#writtenIntermediateBytes) は、一時テーブルによって中間ストレージに書き込まれたバイト数を監視するためのメトリクスをイベントリスナーに公開します。

CTE マテリアライゼーションの使い方

次の構成およびセッションプロパティを使用すると、CTE マテリアライゼーションを有効にし、設定を変更できます。

cte-materialization-strategy

  • 型: string

  • 使用可能な値: ALL, NONE, HEURISTIC, HEURISTIC_COMPLEX_QUERIES_ONLY

  • デフォルト値: NONE

クエリで共通テーブル式(CTE)をマテリアライズするための戦略を指定します。

NONE - CTE はマテリアライズされません。

ALL - クエリ内のすべての CTE がマテリアライズされます。

HEURISTIC - 最初に現れる親 CTE を貪欲にマテリアライズします。この CTE は cte_heuristic_replication_threshold 回以上繰り返されます。

HEURISTIC_COMPLEX_QUERIES_ONLY HEURISTIC の条件を満たし、結合または集計を持つ、最初に現れる親 CTE を貪欲にマテリアライズします。

クエリごとに設定するには、cte_materialization_strategy セッションプロパティを使用します。

cte-heuristic-replication-threshold

  • 型: integer

  • 最小値: 0

  • デフォルト値: 4

cte-materialization-strategyHEURISTIC または HEURISTIC_COMPLEX_QUERIES_ONLY に設定されている場合、CTE はクエリに cte-heuristic-replication-threshold 回以上出現するとマテリアライズされます。

クエリごとに設定するには、cte_heuristic_replication_threshold セッションプロパティを使用します。

query.cte-partitioning-provider-catalog

  • 型: string

  • デフォルト値: system

CTE マテリアライゼーション用のカスタムパーティショニングを提供するカタログの名前。この設定では、CTE マテリアライゼーションに使用するカタログを指定します。

クエリごとに設定するには、cte_partitioning_provider_catalog セッションプロパティを使用します。

cte-filter-and-projection-pushdown-enabled

  • 型: boolean

  • デフォルト値: true

マテリアライズされた CTE に共通フィルターとプロジェクトをプッシュダウンすることを有効または無効にするフラグ。

クエリごとに設定するには、cte_filter_and_projection_pushdown_enabled セッションプロパティを使用します。

hive.cte-virtual-bucket-count

  • 型: integer

  • デフォルト値: 128

クエリで CTE をマテリアライズするために使用するバケットの数。この設定は、CTE のマテリアライゼーション時に使用されるバケットの数を決定し、CTE マテリアライゼーションを含むクエリのパフォーマンスに影響を与える可能性があります。バケットの数を増やすと、並列処理が向上する可能性がありますが、メモリとネットワーク通信のオーバーヘッドも増加します。

推奨値: クラスタサイズの 4 ~ 10 倍。

クエリごとに設定するには、hive.cte_virtual_bucket_count セッションプロパティを使用します。

hive.temporary-table-storage-format

  • 型: string

  • 使用可能な値: PAGEFILE, ORC, DWRF, ALPHA, PARQUET, AVRO, RCBINARY, RCTEXT, SEQUENCEFILE, JSON, TEXTFILE, CSV

  • デフォルト値: ORC

この設定は、CTE マテリアライゼーションによって生成された一時テーブルのデータ形式を決定します。推奨値は PAGEFILE SerializedPage Wire Format です。これは、読み取りと書き込みの際にシリアル化とデシリアライズを回避し、Presto ページを直接保存できるため、最もパフォーマンスが高いためです。

クエリごとに設定するには、hive.temporary_table_storage_format セッションプロパティを使用します。

hive.temporary-table-compression-codec

  • 型: string

  • 使用可能な値: SNAPPY, NONE, GZIP, LZ4, ZSTD

  • デフォルト値: SNAPPY

このプロパティは、CTE マテリアライゼーションによって生成される一時テーブルに使用する圧縮コーデックを定義します。

クエリごとに設定するには、hive.temporary_table_compression_codec セッションプロパティを使用します。

hive.bucket-function-type-for-cte-materialization

  • 型: string

  • 使用可能な値: HIVE_COMPATIBLE, PRESTO_NATIVE

  • デフォルト値: PRESTO_NATIVE

この設定では、CTE マテリアライゼーションのハッシュ関数タイプを指定します。

クエリごとに設定するには、hive.bucket_function_type_for_cte_materialization セッションプロパティを使用します。

query.max-written-intermediate-bytes

  • 型: DataSize

  • デフォルト値: 2TB

この設定は、CTEのマテリアライズ中に書き込まれるデータ量の制限を定義します。クエリがこの制限を超えると、失敗します。

クエリごとに設定するには、query_max_written_intermediate_bytes セッションプロパティを使用してください。

開発への参加方法

課題リスト - (https://github.com/prestodb/presto/labels/cte_materialization)