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

  • 允許的值: ALLNONEHEURISTICHEURISTIC_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-strategy 設定為 HEURISTICHEURISTIC_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

  • 允許的值: PAGEFILEORCDWRFALPHAPARQUETAVRORCBINARYRCTEXTSEQUENCEFILEJSONTEXTFILECSV

  • 預設值: ORC

此設定決定 CTE 物化所產生的臨時表的資料格式。建議值為 PAGEFILE SerializedPage 線路格式,因為它是效能最高的,因為它可以避免在讀取和寫入期間進行序列化和還原序列化,允許直接儲存 Presto 頁面。

使用 hive.temporary_table_storage_format 工作階段屬性,即可在每次查詢時設定。

hive.temporary-table-compression-codec

  • 類型: string

  • 允許的值: SNAPPYNONEGZIPLZ4ZSTD

  • 預設值: SNAPPY

此屬性定義用於 CTE 具體化所產生的暫存表格的壓縮編碼器。

使用 hive.temporary_table_compression_codec 工作階段屬性,即可在每次查詢時設定。

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

  • 類型: string

  • 允許的值: HIVE_COMPATIBLEPRESTO_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)