2016-12-06 63 views
0

試圖更新440萬行表中的列。我已經能夠從30多分鐘縮短我的查詢時間到14分鐘以下版本:Postgres中的緩慢更新

update t_settlement x 
    set dt_ad_decode = y.decode 
    from (Select dt_amountdescription_1to1, dt_decode as decode 
      from d_amountdescription_1to1 
     ) y 
    where x."AmountDescription" = y.dt_amountdescription_1to1; 

我相信必須有此進一步提高的途徑和將不勝感激,如果有人可以幫我在這問候。

問候

SAURABH

回答

1

首先,你爲什麼要使用子查詢?請將其寫成:

update t_settlement s 
    set dt_ad_decode = ad.dt_decode 
    from d_amountdescription_1to1 ad 
    where s."AmountDescription" = ad.dt_amountdescription_1to1; 

這應該不會影響性能,但它會簡化查詢。

接下來,你要在d_amountdescription_1to1(dt_amountdescription_1to1)或索引,更好的是,d_amountdescription_1to1(dt_amountdescription_1to1, dt_decode)

create index idx_d_amountdescription_1to1_2 
    on d_amountdescription_1to1(dt_amountdescription_1to1, dt_decode) 
+0

我之所以這樣做是在一個子查詢是查詢時間比上面的查詢更新較少〜3分鐘。另一個問題,這個指數會提升表現。 –

+0

@SaurabhOmar。 。 。似乎很奇怪。你檢查執行計劃,但我期望子查詢被優化掉。除此之外,該指數應該會提高績效。 –