小编典典

比较几何时查询慢

sql

我正在尝试比较并创建一个新表。但是需要更多时间进行比较。

表1(模式)

+-------------+----------+-------------+
| Column      | Type     | Modifiers   |
|-------------+----------+-------------|
| line_id     | bigint   |             |
| junction    | integer  |             |
| geom        | geometry |             |
+-------------+----------+-------------+
Indexes:
    "points_geom_gix" gist (geom)

其中联结包含0或1。

表2

+----------+----------+-------------+
| Column   | Type     | Modifiers   |
|----------+----------+-------------|
| line_id  | bigint   |             |
| geom     | geometry |             |
+----------+----------+-------------+
Indexes:
    "jxn_geom_gix" gist (geom)

我想通过比较两个表的几何形状来创建一个新表表3。

健康)状况

  • 从两个几何相等的表中选择几何。
  • 从表1中选择geom,其中结点= 1,并且表3中不存在geom。

我尝试如下

CREATE TABLE table3 as select a.geom from table1 a, table2 b where st_equals(a.geom,b.geom);

(在表3的geom列上创建要点索引)

INSERT INTO table3 SELECT a.geom from table1 a, table3 b where a.junction = 1 and NOT st_equals(a.geom,b.geom);

但是第二个查询要花费大量时间。

有人会帮助我优化查询吗?


阅读 206

收藏
2021-05-30

共1个答案

小编典典

使用您的最后一个sql,您将产生几乎笛卡尔的结果。例如,如果表1中有10000个几何,junciton =
1,而表3中不存在,而表3中已经有10000个其他几何,那么对于每个juncition =
1的几何,您将返回10000行。在这种情况下,当您要查找不在其他表中的某些行时,请使用EXISTS子句,它不会使结果成倍增加,也不会产生笛卡尔坐标。

INSERT INTO table3 
SELECT a.geom 
  from table1 a
 where a.junction = 1 
   and NOT exists (select from table3 b 
                    where st_equals(a.geom,b.geom)
                      and st_DWithin(a.geom, b.geom,0));

我编辑了查询-
添加了st_Dwithin(a.geom,b.geom,0),它应该使查询甚至更快,因为不存在,应该只比较它们之间距离为0的这些几何(如果它们之间不存在0距离,那么肯定不相等)。通常,st_dwithin将使用gist索引来筛选距离不够近的相等几何。

2021-05-30