Google BigQuery 上的最佳 JOIN 性能
Posted
技术标签:
【中文标题】Google BigQuery 上的最佳 JOIN 性能【英文标题】:Best JOIN performance on Google BigQuery 【发布时间】:2017-09-07 00:54:34 【问题描述】:我有两个大表,一个基表和一个用于过滤的表。我想要 'my_filter' 为 true 的键。
哪一个为我提供了最好的 Google BigQuery 性能?
标准连接
select
[fields]
from base_table
join filter_table
on filter_table.my_key = base_table.my_key
where filter_table.my_filter
加入子查询
select
[fields]
from base_table
join (
select my_key from filter_table where my_filter
) filter_table
on filter_table.my_key = base_table.my_key
半连接
select
[fields]
from base_table
where my_key in (
select my_key from filter_table where my_filter
)
对于上下文:Google BQ docs discuss semi-joins,但不要解释为什么要使用它们。
【问题讨论】:
【参考方案1】:在将旧版 SQL 与 BigQuery 结合使用时,第一个性能最差,因为过滤器不会通过连接推送。改用standard SQL,它通过连接自动过滤下推。仅当左侧的每个键在右侧表中最多出现一个时,第三个查询才等效;否则它将返回比前两个查询更少的行。
【讨论】:
【参考方案2】:我对你的问题很好奇,决定在我们的 BQ 中进行测试,看看结果会如何变化。
我模拟了一个查询,希望它的工作与您提出的类似。它在未启用缓存的情况下处理了 169 GB 的数据。这是我找到的结果:
标准加入:10.2 秒
加入子查询:10.6s
半连接:10.2s
结论
正如 Elliott 所说,尝试使用标准 SQL。除此之外,BigQuery 在大多数情况下,无论您的查询如何,都会在几秒钟内处理所有内容。
【讨论】:
以上是关于Google BigQuery 上的最佳 JOIN 性能的主要内容,如果未能解决你的问题,请参考以下文章
Google BigQuery 要求 JOIN EACH,但我已经在使用它