【问题标题】:The query for calculating distance stuck the PostgresDB计算距离的查询卡在 PostgresDB
【发布时间】:2021-02-13 20:30:10
【问题描述】:

我的 PostgreSQL 数据库函数有问题。

我正在尝试使用 PostGIS 工具计算两个地理点之间的距离。这两个点在不同的表中,这两个表之间的 KEY 是 site_id 列。

sites表结构为:

CREATE TABLE sites(
  site_id INT,
  site_name text,
  latitude float ( 6 ),
  longitude float ( 6 ),
  geom geometry

);

dots表结构为:

CREATE TABLE dots(
  dot_id INT,
  site_id INT,
  latitude float ( 6 ),
  longitude float ( 6 ),
  rsrp float ( 6 ),
  dist INT,
  project_id INT,
  dist_from_site INT,
  geom geometry,
  dist_from_ref INT;
);

计算距离的函数适用于小表,但不适用于 50K 行。

UPDATE dots 
  SET dist_from_site = t.my_dist
  FROM (
      SELECT dots.site_id, ROUND(100*ST_Distance(dots.geom, sites.geom)) my_dist
      FROM  dots 
      INNER JOIN sites on dots.site_id = sites.site_id 
      WHERE sites.site_id = dots.site_id AND dots.dist_from_site is NULL
  ) t 
  WHERE dots.site_id = t.site_id AND dots.dist_from_site is NULL;

知道如何解决运行时问题并使 PGDB 不会卡住吗?

餐桌图片:

【问题讨论】:

    标签: mysql postgresql postgis


    【解决方案1】:

    为了提高性能,您应该添加这些索引

        create index idx1 on dots (site_id, dist_from_site,  geom);
    
        create index idx2 on sites (site_id, geom);
    

    对于第二次更新,请尝试添加此索引

     create index idx3 on dots ( geom, latitude, longitude);
    

    【讨论】:

    • 如何添加并在函数中使用它?
    • ...您必须只创建一次索引...您可以使用普通的 IDE 或 db 控制台命令执行此操作..在创建表时..或在之后直接添加索引创建创建表
    • 需要改功能吗?
    • 不...您知道什么是索引。以及必须如何创建索引..?
    • 我不知道什么是索引,但我使用 Postgres DB 的控制台创建了它。
    【解决方案2】:

    FROM子句中的dots表不需要重复:


    UPDATE dots d
    SET dist_from_site =  ROUND(100*ST_Distance(d.geom, s.geom))
    FROM sites s
    WHERE d.site_id = s.site_id
    AND d.dist_from_site is NULL
            ;
    

    我希望site_id 是唯一的,至少在sites 中是唯一的,否则每个目标行都会得到多个更新。

    【讨论】:

    • 重点是:如果 site_id 在dots 表中不是唯一的,则您的查询中会得到一个partially carthesian product
    • site_id 是唯一的,我会将其添加到表配置中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多