Избегайте двойного расчета в PostgreSQL и PostGIS для повышения производительности - PullRequest
0 голосов
/ 03 марта 2020

PostgreSQL / Пример PostGIS с двойным вычислением:

select a.gid, b.gid, st_area(st_intersection(a.geom, b.geom)) from a_polygons a, b_polygons b 
where st_intersects(a.geom, b.geom) and st_area(st_intersection(a.geom, b.geom)) > 10;

Есть ли какой-нибудь простой способ в таких случаях избежать двойного (множественного) вычисления одного и того же значения?

Я знаю Я мог бы добиться этого следующим образом:

with i_poly as (select a.gid a_gid, b.gid b_gid, st_area(st_intersection(a.geom, b.geom)) i_area  
from a_polygons a, b_polygons b where st_intersects(a.geom, b.geom))
select a_gid, b_gid, i_area from i_poly where i_area > 10;

Есть ли какой-нибудь простой способ добиться этого без подзапросов et c.? Что-то простое, как:

 select i_area from a_polygons a, b_polygons b where st_area(st_intersection(a.geom, b.geom)) as i_area > 10;

1 Ответ

0 голосов
/ 03 марта 2020

Переместить вычисления многоугольника в предложение from:

select a.gid, b.gid, a.area
from a_polygons a cross join
     b_polygons b cross join lateral
     (values (st_intersects(a.geom, b.geom)) i(intersect) cross join lateral
     (values (st_area(i.intersect))) a(area)
where i.intersect and a.area > 10;
...