基于成本的优化

Presto 支持几种基于成本的优化,如下所述。

连接枚举

连接在查询中执行的顺序会对查询的性能产生重大影响。连接排序方面对性能影响最大的因素是处理和通过网络传输的数据大小。如果在执行初期执行了生成大量数据的连接,那么后续阶段将需要比必要时间更长地处理大量数据,从而增加查询所需的时间和资源。

使用基于成本的连接枚举,Presto 使用连接器提供的表统计信息来估计不同连接顺序的成本,并自动选择具有最低计算成本的连接顺序。

连接枚举策略受join_reordering_strategy 会话属性控制,optimizer.join-reordering-strategy 配置属性提供默认值。

有效值为
  • AUTOMATIC (默认) - 全自动连接枚举已启用

  • ELIMINATE_CROSS_JOINS - 消除不必要的交叉连接

  • NONE - 纯粹的句法连接顺序

如果使用 AUTOMATIC 并且统计信息不可用,或者由于任何其他原因无法计算成本,则改为使用 ELIMINATE_CROSS_JOINS 策略。

连接分布选择

Presto 使用基于哈希的连接算法。这意味着对于每个连接运算符,必须从一个连接输入(称为构建端)创建哈希表。然后迭代另一个输入(探测端),并为每个行查询哈希表以查找匹配的行。

连接分布有两种类型
  • 分区:参与查询的每个节点仅从一小部分数据构建哈希表

  • 广播:参与查询的每个节点都从所有数据(数据被复制到每个节点)构建哈希表

每种类型都有其权衡。分区连接需要使用连接键的哈希重新分配两个表。这可能比广播连接慢(有时慢得多),但允许进行更大的连接。特别是,如果构建端远小于探测端,则广播连接将更快。但是,广播连接要求连接过滤后的构建端的表在每个节点的内存中都容得下,而分布式连接只需要在所有节点的分布式内存中容得下。

使用基于成本的连接分布选择,Presto 会自动选择使用分区连接还是广播连接。结合基于成本的连接枚举和基于成本的连接分布,Presto 会自动选择哪一端是探测端,哪一端是构建端。

连接分布类型受join_distribution_type 会话属性控制,join-distribution-type 配置属性提供默认值。

有效值为
  • AUTOMATIC (默认) - 连接分布类型对于每个连接自动确定

  • BROADCAST - 广播连接分布用于所有连接

  • PARTITIONED - 分区连接分布用于所有连接

限制复制表大小

当连接重排序策略设置为 COST_BASED 或当连接分布类型设置为 AUTOMATIC 时,连接分布类型将自动选择。在这种情况下,可以通过 join-max-broadcast-table-size 配置属性(例如 join-max-broadcast-table-size=100MB)或通过 join_max_broadcast_table_size 会话属性(例如 set session join_max_broadcast_table_size='100MB';)来限制复制表的最大大小。这允许提高集群并发性并防止 CBO 误估连接表大小时的不良计划。

默认情况下,复制表大小限制为 100MB。

连接器实现

为了使 Presto 优化器能够使用基于成本的策略,连接器实现必须提供表统计信息.