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
序列化页面线格式,因为它是最高效的,因为它避免了在读写期间的序列化和反序列化,允许直接存储 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)