首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带广播连接分布的Presto多表连接

带广播连接分布的Presto多表连接
EN

Stack Overflow用户
提问于 2020-06-18 13:32:33
回答 1查看 843关注 0票数 0

我有三张桌子:

代码语言:javascript
运行
复制
A
 - id1
 - data
代码语言:javascript
运行
复制
B 
 - id1
 - id2
 - data
代码语言:javascript
运行
复制
C
 - id2
 - data
  • 表A非常小,而表B和表C可能很大。
  • 表B有表A和表C的连接键,所以必须在第一个联接中出现。
  • 根据我对Presto中的Joins的了解,当没有启用基于成本的选项时,连接执行的顺序就是Joins的声明顺序。
  • 此外,我们显然希望在第一个联接操作中有较小的表A,因为这将减少数据大小。
  • 因此,这意味着第一个连接将在表A和表B之间
  • 但是,如果我想执行分布式连接,则连接的构建端(右侧)应该是较小的表。
  • 因此,当我谈到AxB和C的结果之间的第二个连接时,连接的右侧必然是较大的表。

很好奇人们是如何处理普雷斯托的这种场景的。如果分布式连接的构建侧是左侧,那么我们总是将较小的表订购到左边,这是很自然的。

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

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 14:54:49

Presto通常按照声明的顺序执行连接(当基于成本的优化关闭时),但如果可能的话,它会尝试避免交叉连接。如果在查询上运行解释,则应该能够看到查询的实际连接顺序。

对于上面的示例,您可以手动地避免交叉连接,方法是强制右关联连接加上括号,类似于算术的工作方式(例如,a - (b - c)):

代码语言:javascript
运行
复制
WITH 
   a(x) AS (VALUES(1)), 
   b(x,y) AS (VALUES (1,'a')), 
   c(y) AS (VALUES 'a')
SELECT * 
FROM c JOIN (b JOIN a USING (x)) USING (y)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62451184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档