ST_contains 花太多时间

ST_contains taking too much time

我正在尝试使用以下查询

将latitude/longitude匹配到特定的邻居位置
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是column类型的geometry
我已经创建了如下索引

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

我在主 table 中有将近 300 万条记录,在 GEOM table 中有 200 条几何信息。解释查询分析花费了如此多的时间(2 小时)。 请让我知道,我该如何优化这个查询。

提前致谢。

  • 如评论中所述,请勿使用 ST_AsText():那不属于那里。它将 geom 转换为文本,然后返回到 geom。但是,更重要的是,该过程可能会弄乱索引。
  • 如果您仅在列上独一无二,则使用 DISTINCT ON,无需比较其他列。
  • 如果您在 ID 列上是独一无二的,并且您唯一的加入是为了增加选择性,那么请考虑使用 EXISTS。除了 geom 之外,这些列中的任何一个都来自 borough_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);