我正在尝试比较并创建一个新表。但是需要更多时间进行比较。
表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。
健康)状况
我尝试如下
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);
但是第二个查询要花费大量时间。
有人会帮助我优化查询吗?
使用您的最后一个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索引来筛选距离不够近的相等几何。