选择加入每个运行永远,当删除"每个",它工作正常。

时间:2015-09-05 16:54:51

标签: google-bigquery

我有一个选择左边连接,每个用于运行OK。 现在它永远运行,当我删除"每个"时,它运行正常。

知道为什么吗?我们应该删除所有"每一个"条款?也适用于群组和其他联接? 这很关键,因为它在很多地方嵌入我们的代码中,突然间事情变得非常缓慢。

非常感谢。

2 个答案:

答案 0 :(得分:1)

我不认为我会建议明确指定eachall。这是一个过早的优化。 BigQuery是或应该足够聪明,以确定加入的最佳策略是什么。这可能就是为什么你看到加速:让BigQuery做繁重的工作,它找到了一个更快的方法。

答案 1 :(得分:0)

当您加入的桌子太大而无法加入时,应使用JOIN EACH。

首先,让我解释一下正常的JOIN是如何完成的。这是如何工作的,如果你的表不到8兆字节,它将完全发送到运行部分查询的每个分片。这很快,这是尽可能高效的,并不需要您的优化。如果您的表超过8 MB,则JOIN不起作用,因为它不能向每个分片发送超过8 MB的数据。

现在,对于“JOIN EACH”:无论你的表是否大于或等于8 MB,如果你使用JOIN EACH,系统将对你加入的任何内容进行哈希处理并仅将相关结果发送到每个分片,最小化您运行的连接数,并确保每个分片都具有所有相关数据。如果你对一个具有低熵的参数进行连接(一切都相似,所以哈希结果可能都是在相同的几个分片上结束),你的分片有可能没有得到最佳使用(1个分片可以查询90%的分片)你的数据,让其他X分片处理它的10%)。如果你有超过8 MB的表,具有低熵,那么额外的散列+这种低效的分片可能会解释正在发生的事情。

基本上,就像Giovanni所指出的那样...... BQ知道该怎么做,所以让它做它的事情:)