2017-07-24 98 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將使用主要索引來過濾不夠接近以致相等的幾何。