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,但我已经在使用它

在 Google bigquery 中加入 3 个表

适用于 BigQuery 的最佳 Google Cloud Storage

在 BigQuery 中使用 JOIN 过滤国家/地区

从 Bigquery 导出到存储

BigQuery 上的提取作业不能确保 Google 存储上的文件