2017-07-24 27 views
2

我想比较并创建一个新表。但它需要更多时间来比较。比较几何时缓慢的查询

表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两张桌子。

条件

  • 两个表中的其中两个几何相等选择GEOM。
  • 从表1,其中结= 1和和的geom不存在选择的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); 

但第二Q-尤里需要很多时间。

有人可以帮助我优化查询吗?

回答

1

随着你最后的SQL你产生近笛卡尔的结果。例如,如果您有10000个几何图形,并且table1中的junciton = 1,而table3中不存在,并且表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),它应该使查询速度更快,如果没有不存在应比较只有这些geoms是它们之间的距离0( 0之间的距离肯定不相等)。一般来说,st_dwithin将使用主要索引来过滤不够接近以致相等的几何。