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)