繁体   English   中英

如何提高 BigQuery 中 ST_INTERSECT 的性能?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM