2017-05-08 57 views
1

我在Postgres數據庫運行一個相對簡單的查詢:簡單查詢到很長一段時間

INSERT INTO tt (pid, trip_pid) SELECT stop_time.pid, trip.pid         
FROM stop_time, trip                   
WHERE stop_time.trip_id = trip.trip_id AND 
17 = trip.gtfsfeed_id 
AND 17 = stop_time.gtfsfeed_id 

TT是一個臨時表,stop_time的包含約200萬行,行程只包含大約50,000。這個查詢在我的aws rds實例上運行了一個多小時,我不知道爲什麼。這個查詢有沒有可悲的低效率?

編輯:這裏是EXPLAIN(我創建了一個新的臨時表相同的列運行解釋)

        QUERY PLAN         
-------------------------------------------------------------------------------- 
Insert on ll (cost=2604.38..75394.65 rows=1649975 width=8) 
    -> Hash Join (cost=2604.38..75394.65 rows=1649975 width=8) 
     Hash Cond: ((stop_time.trip_id)::text = (trip.trip_id)::text) 
     -> Seq Scan on stop_time (cost=0.00..49406.68 rows=1835694 width=34) 
       Filter: (gtfsfeed_id = 17) 
     -> Hash (cost=2123.74..2123.74 rows=38451 width=34) 
       -> Seq Scan on trip (cost=0.00..2123.74 rows=38451 width=34) 
        Filter: (gtfsfeed_id = 17) 
+0

你能向我們展示查詢的'EXPLAIN PLAN'嗎? –

+0

我已經添加了它 – Derongan

+0

嘗試使用forall語句批量插入。 – Avi

回答

1

您的tripstop_time表中的順序掃描表明,它們未在trip_id字段中編入索引。將trip_id索引添加到兩個表中將顯着改善JOIN

此外,在兩個表中添加索引gtfsfeed_id將使查詢更快,因爲您的查詢將結果限制爲這些字段的特定值。

提示:添加JOINWHERE語句中使用的字段索引通常很有用。

1

檢查該查詢,mayby會更快

INSERT INTO tt (pid, trip_pid) 
SELECT stop_time.pid, trip.pid         
FROM stop_time st 
join trip t on t.trip_id = st.trip_id 
where t.gtfsfeed_id = 17 
and st.gtfsfeed_id = 17; 

,你可以添加索引列gtfsfeed_id

1

請參閱表統計數據是準確的,並嘗試索引stop_time(gtfsfeed_id)和/或trip(gtfsfeed_id)