查询按地理位置聚类的 BigQuery 表与其他表中的地理位置相交时不会提高性能

问题描述 投票:0回答:1

我有一个大型 (250 GB) BigQuery 表,表示值网格,网格单元存储为多边形。该表按此地理列聚集。我有第二个包含各种多边形的表,我想获取这些多边形之一内的网格单元值(例如,查询特定国家/地区边界内的一些天气数据)。

当我使用 ST_GEOGFROMGEOJSON 执行网格表与单个多边形的空间交集时,我发现查询成本(处理的字节数)很低(100 Mb)。但是,当我使用多边形作为 select 语句的一部分执行相同的查询时,我发现该表已完全扫描并且成本很高(250 Gb)。

这是一个可重现的示例。使用特定多边形查询以下公共数据集时:

SELECT npp FROM `bigquery-public-data.modis_terra_net_primary_production.MODIS_MOD17A3HGF` 
WHERE year=2020
AND ST_INTERSECTS(geography_polygon, ST_GEOGFROMGEOJSON('{ "type": "Polygon", "coordinates": [ [ [ -101.1, 50 ], [ -101, 50 ], [ -101, 56 ], [ -101.1, 56 ], [ -101.1, 50 ] ] ] }'))

-- 已处理的字节数 -- 785.45 MB -- 计费字节数 -- 786 MB

使用相同的多边形作为表中选择语句的一部分:

CREATE OR REPLACE TABLE `tmp.polygon`
AS SELECT ST_GEOGFROMGEOJSON('{ "type": "Polygon", "coordinates": [ [ [ -101.1, 50 ], [ -101, 50 ], [ -101, 56 ], [ -101.1, 56 ], [ -101.1, 50 ] ] ] }') geog;

SELECT npp FROM `bigquery-public-data.modis_terra_net_primary_production.MODIS_MOD17A3HGF` 
WHERE year=2020
AND ST_INTERSECTS(geography_polygon, (SELECT geog FROM `tmp.polygon`))

-- 已处理的字节数 -- 522.15 GB -- 计费字节数 -- 522.15 GB

我使用交叉连接或内部连接得到了相同的结果。

为什么聚类不能与 select 语句一起使用? 有没有一种方法可以在不添加自定义集群/分区列的情况下降低查询成本?

sql google-bigquery clustering-key
1个回答
0
投票

此优化仅由 BigQuery 针对过滤器中的恒定地理位置实施。

解决方法是使用 BigQuery 过程语言将查询分为两部分 (https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language)。

DECLARE poly GEOGRAPHY;
SET poly = (SELECT geog FROM `tmp.polygon`);

SELECT npp FROM `bigquery-public-data.modis_terra_net_primary_production.MODIS_MOD17A3HGF` 
WHERE year=2020
AND ST_INTERSECTS(geography_polygon, poly);

这需要 786 MB。

© www.soinside.com 2019 - 2024. All rights reserved.