Join 具有广播连接分布的Presto多表连接

Join 具有广播连接分布的Presto多表连接,join,query-optimization,presto,Join,Query Optimization,Presto,我有三张桌子: A - id1 - data 表A非常小,而表B和C可能很大 表B具有表A和表C的连接键。因此,必须在第一个连接中出现 从我对Presto中的连接的理解来看,基于成本 如果未启用optmization,则连接执行的顺序为 连接声明的顺序 此外,我们显然希望 在第一个联接操作中使用较小的表A,如下所示 减少数据大小 因此,这意味着第一个连接将在表A和表B之间 但是,如果我想执行分布式连接, 那么连接的构建端(右侧)应该更小 桌子 因此,当我谈到AxB和C的结果之间的第二个联

我有三张桌子:

A
 - id1
 - data
  • 表A非常小,而表B和C可能很大

  • 表B具有表A和表C的连接键。因此,必须在第一个连接中出现

  • 从我对Presto中的连接的理解来看,基于成本 如果未启用optmization,则连接执行的顺序为 连接声明的顺序
  • 此外,我们显然希望 在第一个联接操作中使用较小的表A,如下所示 减少数据大小
  • 因此,这意味着第一个连接将在表A和表B之间
  • 但是,如果我想执行分布式连接, 那么连接的构建端(右侧)应该更小 桌子
  • 因此,当我谈到AxB和C的结果之间的第二个联接时,联接的右侧不可避免地会成为较大的表
非常好奇人们在普雷斯托通常是如何处理这种情况的。如果分布式联接的构建端是左侧,那么我们总是将较小的表排序到左侧,这将很自然


按照定义的顺序执行联接,并期望分布式联接的右侧表更小的想法似乎是矛盾的。

Presto通常按照声明的顺序执行联接(当基于成本的优化关闭时),但如果可能,它会尝试这样做。如果运行查询,应该能够看到查询的实际联接顺序

对于上面的示例,您可以通过强制使用括号进行右关联联接来手动避免交叉联接,类似于算术的工作方式(例如,
a-(b-c)
):

与
a(x)AS(值(1)),
b(x,y)AS(值(1,'a')),
c(y)AS(值“a”)
选择*
从c连接(b使用(x)连接a)使用(y)
B 
 - id1
 - id2
 - data
C
 - id2
 - data