2016-12-06 1 views
0

Mise à jour d'une colonne dans une table de 4,4 millions de lignes. Je suis en mesure de réduire mon temps de recherche de plus de 30 minutes à 14 minutes avec la version suivante:Mise à jour lente dans 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; 

Je suis sûr qu'il doit y avoir des moyens d'améliorer plus loin et serait reconnaissant si quelqu'un pouvait me aider dans ce Cordialement.

Cordialement

Saurabh

Répondre

1

D'abord, pourquoi utilisez-vous un sous-requête? Ecrivez ceci plus simplement:

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

Ceci ne devrait pas affecter les performances, mais simplifie la requête.

Ensuite, vous voulez un index sur d_amountdescription_1to1(dt_amountdescription_1to1) ou, mieux encore, 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

La raison pour laquelle je l'ai fait dans une sous-requête était que la requête a ~ 3 minutes moins que la requête mise à jour ci-dessus. Une autre question, cet indice va booster les performances. –

+0

@SaurabhOmar. . . Cela semble étrange. Vous vérifiez les plans d'exécution, mais je m'attendrais à ce que la sous-requête soit optimisée. L'indice devrait améliorer les performances au-delà de cela. –