1

我有两个大表,一个基表和一个用于过滤的表。我想要“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 文档讨论了半连接,但没有解释为什么要使用它们。

4

2 回答 2

2

在将旧版 SQL 与 BigQuery 结合使用时,第一个性能最差,因为过滤器不会通过连接推送。改用标准 SQL,它通过连接自动过滤下推。仅当左侧的每个键在右侧表中最多出现一个时,第三个查询才等效;否则它将返回比前两个查询更少的行。

于 2017-09-07T03:50:23.997 回答
1

我对您的问题感到好奇,并决定在我们的 BQ 中进行测试,看看结果会如何变化。

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

标准加入:10.2s

在此处输入图像描述

加入子查询:10.6s

在此处输入图像描述

半连接:10.2s

在此处输入图像描述

结论

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

于 2017-09-07T14:15:29.670 回答