代码之家  ›  专栏  ›  技术社区  ›  hr02

ST\U包含占用太多时间

  •  1
  • hr02  · 技术社区  · 7 年前

    我正在尝试使用下面的查询将纬度/经度匹配到特定的邻居位置

    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 回复  |  直到 7 年前
        1
  •  3
  •   Evan Carroll    7 年前
    • 如评论中所述,不要使用 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);