如何将此子查询优化为连接?

时间:2012-06-23 07:55:30

标签: sql postgresql optimization postgis

我注意到运行此子查询

  

选择   ST_Area(ST_Union(ST_Transform(ST_Intersection((SELECT poly1.the_geom from poly1 WHERE poly1.polygon_type ='P'),poly2.the_geom),3857)))

     

AS area_of_P   FROM poly1,poly2

明显慢于运行此连接

  

选择   ST_AREA(ST_Union(ST_Transform(ST_Intersection(poly1.the_geom,poly2.the_geom),3857)))

     

AS area_of_poly

     

FROM poly2

     

在st_intersects上左边连接poly1(poly1.the_geom,poly2.the_geom)

     

WHERE poly2.polygon_type ='P'

但是,我需要扩展第二个连接版本以返回更多列,每个列都计算出给定多边形类型的区域,即

  

选择   ST_Area(ST_Union(ST_Transform(ST_Intersection((SELECT poly1.the_geom from poly1 WHERE poly1.polygon_type ='P'),poly2.the_geom),3857)))   AS area_of_P,

     

ST_Area(ST_Union(ST_Transform(ST_Intersection((SELECT poly1.the_geom from poly1 WHERE poly1.polygon_type ='S'),poly2.the_geom),3857)))   AS area_of_S

     

FROM poly1,poly2

1 个答案:

答案 0 :(得分:6)

试试这个。

SELECT ST_AREA(ST_Union(ST_Transform(ST_Intersection(poly1.the_geom,poly2.the_geom),3857)))

AS area_of_poly

FROM poly2

LEFT JOIN poly1 on st_intersects(poly1.the_geom,poly2.the_geom)

WHERE poly2.polygon_type IN ( 'P', 'S' )

编辑:

SELECT ST_AREA(ST_Union(ST_Transform(ST_Intersection(ps.the_geom,poly2.the_geom),3857))) AS area_of_P,
       ST_AREA(ST_Union(ST_Transform(ST_Intersection(ss.the_geom,poly2.the_geom),3857))) AS area_of_S
FROM poly2
JOIN poly1 ps ON poly2.polygon_type = 'P' AND st_intersects(ps.the_geom,poly2.the_geom)
JOIN poly1 ss ON poly2.polygon_type = 'S' AND st_intersects(ss.the_geom,poly2.the_geom)