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 都会在几秒钟内处理所有内容。
我有两个大的 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 都会在几秒钟内处理所有内容。