Google BigQuery 上的最佳 JOIN 性能

Best JOIN performance on Google BigQuery

我有两个大的 table,一个基础 table 和一个 table 我用来过滤。我想要 'my_filter' 为真的键。

哪个给了我最好的性能 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 但不要解释为什么要使用它们。

第一个性能最差,当使用旧版 SQL 和 BigQuery 时,因为过滤器不会通过连接推送。使用 standard SQL 代替,它通过连接自动过滤下推。第三个查询只有当左边的每个键在右边最多出现一个时才等价table;否则它将比前两个查询少 return 行。

我对你的问题很好奇,因此决定 运行 在我们的 BQ 中进行测试,看看结果会如何变化。

我已经模拟了一个查询,希望它能完成与您提出的类似的工作。它在未启用缓存的情况下处理了 169 GB 的数据。这是我找到的结果:

标准连接:10.2s

加入子查询:10.6s

半连接:10.2s

结论

正如 Elliott 所说,尝试使用标准 SQL。除此之外,在大多数情况下,无论您的查询如何,BigQuery 都会在几秒钟内处理所有内容。