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 设置为 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

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