为什么有一个 Each 修饰符?

Why is there an Each modifier?

来自文档:

Normal JOIN operations require that the right-side table contains less than 8 MB of compressed data. The EACH modifier is a hint that informs the query execution engine that the JOIN might reference two large tables. The EACH modifier can't be used in CROSS JOIN clauses.

When possible, use JOIN without the EACH modifier for best performance. Use JOIN EACH when table sizes are too large for JOIN.

为什么不是自动的?

有没有办法简化这个?我可以总是使用 JOIN EACH 还是总是使用 JOIN(由于上面写的 8mb 限制,我似乎不能总是使用 join)

BigQuery 在许多服务器中并行处理信息,这些服务器将压缩信息传递到树形拓扑中的其他服务器。一切都在根节点中结束,BigQuery 的一些限制来自这个瓶颈:您可以读取 "unlimited" 量的数据,但查询的输出必须适合单个服务器。

(2010 年 Dremel 论文中有更多详细信息 http://research.google.com/pubs/pub36632.html

为了克服这个限制,引入了 EACH 关键字:它在起始级别强制进行洗牌,允许任务并行化 - 无需单个输出节点 - 并允许连接无限大小的表。这种方法有一些缺点,比如失去了对最终结果进行排序的能力,因为没有单个节点可以看到整个输出。

BigQuery 是否可以自动检测何时使用 EACH?理想情况下,但现在 EACH 关键字允许您完成以前不可能的操作 - 缺点是需要您注意它。