比较几何时查询速度慢

时间:2017-07-24 08:06:38

标签: sql postgresql postgis

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

表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)

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

条件

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

我试过以下

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

(在table3的geom列上创建gist索引)

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

但第二个问题需要花费大量时间。

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

1 个答案:

答案 0 :(得分:1)

使用你的上一个sql,你会产生近乎笛卡尔的结果。例如,如果table1中的junciton = 1具有10 000个几何,而table3中没有这些几何,而在表3中,您已经有10 000个其他几何,那么对于每个具有juncition = 1的几何,您将返回10 000行。 在这种情况下,当你想要找到一些不在其他表中的行时,使用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距离的这些geom(如果它们之间没有0距离)肯定没有平等)。通常st_dwithin将使用gist索引来过滤不够接近等于的geoms。