我正在尝试比较并创建一个新表。但它需要更多的时间进行比较。
表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)
我想通过比较两个表的几何来创建一个新的表格表。
条件
我试过以下
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);
但第二个问题需要花费大量时间。
有人会帮助我优化查询吗?
答案 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。