2016-12-06 6 views
0

Der Versuch, eine Spalte in einer Tabelle mit 4,4 Millionen Zeilen zu aktualisieren. Ich habe in der Lage zu meiner Anfrage Zeit von mehr als 30 Minuten bis 14 Minuten mit der folgenden Version zu reduzieren:Langsame Aktualisierung in 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; 

Ich bin sicher, es muss Möglichkeiten geben, diese weiter zu verbessern und wäre dankbar, wenn mir jemand dabei helfen könnte Grüße.

Grüße

Saurabh

Antwort

1

Erstens, warum verwenden Sie eine Unterabfrage? Schreiben Sie das einfacher als:

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

Dies sollte die Leistung nicht beeinträchtigen, aber es vereinfacht die Abfrage.

Als nächstes wollen Sie einen Index für d_amountdescription_1to1(dt_amountdescription_1to1) oder, noch besser, 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

Der Grund, warum ich es in einer Unterabfrage habe, dass die Abfrage dauerte bis 3 Minuten weniger als die obigen Abfrage aktualisiert. Eine weitere Frage, wird dieser Index die Leistung steigern. –

+0

@SaurabhOmar. . . Scheint seltsam. Sie überprüfen die Ausführungspläne, aber ich würde erwarten, dass die Unterabfrage weg optimiert wird. Der Index sollte darüber hinaus die Performance verbessern. –