Google bigquery 删除“时,选择“永久加入每个跑步”;每一个;,它工作正常。

Google bigquery 删除“时,选择“永久加入每个跑步”;每一个;,它工作正常。,google-bigquery,Google Bigquery,我有一个选择和左连接每个用来运行OK。 现在它永远运行,当我删除“每个”时,它运行正常 知道为什么吗?我们是否应该删除所有的“每个”条款?也适用于组和其他联接? 这是至关重要的,因为这在我们的代码中的许多地方都嵌入了,而且突然间事情运行得非常慢 非常感谢。我不建议明确指定每个或所有。这是一个过早的优化。BigQuery已经或者应该足够聪明,能够弄清楚加入的最佳策略是什么。这可能就是您看到加速的原因:让BigQuery完成繁重的工作,它找到了一种更快的方法。当您要加入的表太大而无法加入时,应该使用

我有一个选择和左连接每个用来运行OK。 现在它永远运行,当我删除“每个”时,它运行正常

知道为什么吗?我们是否应该删除所有的“每个”条款?也适用于组和其他联接? 这是至关重要的,因为这在我们的代码中的许多地方都嵌入了,而且突然间事情运行得非常慢


非常感谢。

我不建议明确指定
每个
所有
。这是一个过早的优化。BigQuery已经或者应该足够聪明,能够弄清楚加入的最佳策略是什么。这可能就是您看到加速的原因:让BigQuery完成繁重的工作,它找到了一种更快的方法。当您要加入的表太大而无法加入时,应该使用每个联接

首先,让我解释一下正常连接是如何完成的。其工作原理是,如果您的表小于8兆字节,它将完全发送到运行部分查询的每个碎片。这是很快的,这是尽可能有效的,并且实际上不需要您进行优化。如果您的表超过8Mbs,那么JOIN就不起作用,因为它不能向每个碎片发送超过8Mbs的数据

现在,对于“JOIN-EACH”:无论您的表是大于还是小于8Mbs,如果您使用JOIN-EACH,系统都会对您加入的内容进行散列,并只将相关结果发送到每个切分,以最小化您运行的连接数量,并确保每个切分都有所有相关数据可以工作。如果在低熵的参数上进行连接(一切都是相似的,因此散列结果可能都在相同的几个碎片上结束),则有可能您的碎片没有得到最佳使用(1个碎片可以查询90%的数据,让其他X个碎片处理10%的数据)。如果您的表小于8Mbs,并且熵很低,那么额外的哈希+可能导致的低效分片可以解释发生了什么

基本上,正如乔瓦尼所指出的。。。。。BQ知道该做什么,所以让它自己做吧:)