[英]How to improve performance of ST_INTERSECT in BigQuery?
我有两张表,一张有 166M 地址点,一张有 170,000 个区域多边形。 我想通过多边形将这些点相交以获得一个包含地址 id 和地址所在区域的区域 id 的表。为了避免与 state 边界重叠的区域出现问题(因为这是单个 state 数据集的合并数据集),我添加了一个条件,即每个文件中的 state 必须相同。
为了提高性能,两个输入表都按各自的几何字段进行了聚类,使用了内部连接,并且输入表被具体化为表( 根据使用空间连接的文档)。 但是,该过程在完成之前超时。
为了进行故障排除,我确保区域多边形具有预期的方向(这是本文中的问题),并且我还查看了有关优化查询的 BigQuery 文档
我尝试的第一件事是标准的内部连接:
SELECT
addr.id_address,
prec.id_precinct,
prec.geom
FROM precincts AS prec
INNER JOIN addresses AS addr
ON prec.geo_state = addr.geo_state
AND ST_INTERSECTS(addr.geom, prec.geom)
我也尝试过使用 window function:
SELECT *
FROM (
SELECT
addr.id_address,
prec.id_precinct,
prec.geom,
ROW_NUMBER() OVER(PARTITION BY addr.geo_state) AS rn
FROM addresses AS addr
INNER JOIN precincts AS prec
ON prec.geo_state = addr.geo_state
AND ST_INTERSECTS(addr.geom, prec.geom)
) AS ranked
WHERE rn = 1
在这两种情况下,它都会在完成之前超时。 非常感谢有关如何优化此查询的任何帮助。 请注意,我使用dbt
来运行它,并且我将超时设置为 1800 秒(不过,在 BigQuery UI 中运行它时也会超时)。
TL;DR:查询是否运行得足够快,是否删除了 state 相等条件prec.geo_state = addr.geo_state
? 如果是,解决方案是将其删除并作为单独的查询单独过滤,或者将其转换为=
两边都依赖于左右连接子项的东西,例如
CONCAT(prec.geo_state, ".", addr.geo_state) = CONCAT(addr.geo_state, ".", prec.geo_state)
说明:BigQuery 尚不支持有效混合不同类型的 JOIN 条件。 如果它在单个连接中同时看到相等条件和地理空间条件,它“更喜欢”相等连接,将地理空间谓词作为常规过滤条件执行,而不是构建和使用地理空间索引。
这就是为什么这个技巧通常会提高性能:它“隐藏”相等条件,让 BigQuery 使用地理空间连接,然后才检查现在复杂的相等条件。 当然,它只有在没有 state 相等谓词的查询运行得相当快时才有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.