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-strategy
設定為 HEURISTIC
或 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 線路格式,因為它是效能最高的,因為它可以避免在讀取和寫入期間進行序列化和還原序列化,允許直接儲存 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)