Google bigquery 在BigQuery中高效地加入IP范围

Google bigquery 在BigQuery中高效地加入IP范围,google-bigquery,Google Bigquery,我有一个IP地址表和一个IP地址范围表(起始IP、结束IP),我想把它们连接在一起。我已经能够通过以下查询实现这一点: SELECT * FROM `ips` i JOIN `ranges` a ON NET.SAFE_IP_FROM_STRING(i.ip) BETWEEN NET.SAFE_IP_FROM_STRING(a.start_ip) AND NET.SAFE_IP_FROM_STRING(a.end_ip) 我的问题是它的伸缩性非常差。10个IP需要8秒左右,100个IP需

我有一个IP地址表和一个IP地址范围表(起始IP、结束IP),我想把它们连接在一起。我已经能够通过以下查询实现这一点:

SELECT * FROM `ips` i
JOIN `ranges`  a
ON NET.SAFE_IP_FROM_STRING(i.ip) 
BETWEEN NET.SAFE_IP_FROM_STRING(a.start_ip) 
AND NET.SAFE_IP_FROM_STRING(a.end_ip)
我的问题是它的伸缩性非常差。10个IP需要8秒左右,100个IP需要30秒,1000个IP需要几分钟。我希望能够为数千万行这样做。(我曾尝试将
NET.SAFE\u IP\u的输出从\u STRING
写入ranges表,但它只将速度提高了10%左右,并且无助于扩展)


范围不重叠,因此对于输入表中的每一行,我希望输出表中有0或1行。横向连接可以让我这样做,而且几乎可以肯定会加快速度,但我认为BigQuery不支持它们。有没有其他方法可以让这个查询更快、更具可扩展性?

我在

我需要更新对#standardSQL的查询,但基本的秘密是生成一个较小的连接区域


如果你能分享一个样本数据集,我很乐意提供一个新的查询。

在阅读了Felipe的答案中链接到的文章后,我能够将一些速度惊人、可扩展性非常好的东西组合在一起。正如Felipe提到的,诀窍是对前缀进行直接连接(我使用/16),然后使用中间值进行过滤。我正在对范围进行预处理,以便将大于a/16的任何内容拆分为多个块。然后,我使用此查询覆盖该表,这将添加一些附加字段:

SELECT *, 
NET.SAFE_IP_FROM_STRING(start_ip) AS start_b, 
NET.SAFE_IP_FROM_STRING(end_ip) AS end_b, 
NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(start_ip), 16) as prefix
然后,联接查询的外观如下所示:

SELECT * FROM `ips` i
JOIN `ranges`  a
ON a.prefix = NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(i.ip), 16)
WHERE NET.SAFE_IP_FROM_STRING(i.ip) BETWEEN a.start_b AND a.end_b
将1000万IP加入到100万范围现在在计费第1层只需不到30秒