来自official docs我们读到 LEFT/RIGHT/FULL OUTER JOINS 没有针对空间数据进行优化。我一直在运行几个对 GEOGRAPHY
数据类型使用复杂连接的长查询。
我的问题是,BigQuery 如何在幕后处理空间数据连接?是否所有内容都转换为 Geohash?
我已经尝试通过 GEOGRAPHY
类型的列对我的表进行聚类,但到目前为止,速度改进微乎其微。
如果我在 JOIN 的 where 子句中使用 Geohash (STRING) 而不是 GEOGRAPHY
类型,这会导致性能提升吗?
这是我正在谈论的例子:
select t1.Geohash, t1.Name, t1.Way, t1.Long, t1.Lat, t1.CoreInt
, t1.Label, t1.IntLat, t1.IntLong
, row_number() over(partition by Geohash order by Dist) as RowNum
, Distance
from table_name t1
left outer join (select Geohash, Label from table where CoreInt = 1) t2
using (Geohash)
where t2.Label is null
or t1.Label = t2.Label
谢谢
最佳答案
是的,BigQuery 尚未优化 LEFT/RIGHT/OUTER 空间连接。
现在您需要将此类联接转换为 INNER JOIN + 选择不匹配的行,例如,请参见以下问题: How to JOIN in geography columns using ST_CONTAINS in Big query
BigQuery 在内部使用 S2 索引。它可能比加入 geohash 更快或更慢,具体取决于数据。但与在 geohash 上加入不同,它保证了正确的结果。
加入Geohash有两个主要问题:
1) Geohash 桶不是统一的,相同固定长度的 geohashes 描述了赤道附近比两极附近大得多的真实区域。 S2 提供更统一的索引。
2) Geohash 也可能会遗漏一些应该连接的对,当两个地理位置足够接近但刚好跨越 geohash split 边界并因此散列为不同的值时。例如,刚好低于和刚好高于 45 平行线的点将具有不同的 geohash 值,即使它们非常接近,并且人们希望它们加入。
关于sql - BigQuery 如何执行空间连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977154/