ST_contains花费了太多时间

时间:2017-12-07 03:11:19

标签: postgresql optimization gis postgis

我正在尝试使用以下查询

将纬度/经度与特定邻居位置相匹配
create table address_classification as (
select distinct buildingid,street,city,state,neighborhood,borough
from master_data
join 
Borough_GEOM
on st_contains(st_astext(geom),coordinates) = 'true'
);

在此,坐标格式低于

ST_GeometryFromText('POINT('||longitude||' '||latitude||')') as coordinates

和geom是列类型几何 我已经创建了如下索引

CREATE INDEX coordinates_gix ON master_data USING GIST (coordinates);
CREATE INDEX boro_geom_indx ON Borough_GEOM USING gist(geom);

主表中有近300万条记录,GEOM表中有200条几何信息。解释分析查询花了这么多时间(2小时)。 请告诉我,如何优化此查询。

提前致谢。

1 个答案:

答案 0 :(得分:2)

  • 如评论中所述,请勿使用ST_AsText():不属于那里。它将geom转换为文本,然后返回geom。但是,更重要的是,这个过程很可能会弄错指数。
  • 如果您只在列中使用,则使用DISTINCT ON,无需比较其他列。
  • 如果您在ID列上是唯一的,并且您只是加入选择性,那么请考虑使用EXISTS。这些列中的任何一列都来自borough_GEOM以外的geom吗?

我会从这样的事情开始,

CREATE TABLE address_classification AS 
  SELECT DISTINCT ON (buildingid),
    buildingid,
    street,
    city,
    state,
    neighborhood,
    borough
  FROM master_data
  JOIN borough_GEOM
    ON ST_Contains(geom,coordinates);
相关问题