2016-12-06 4 views
0

Пытается обновить столбец в таблице из 4,4 миллиона строк. Я был в состоянии сократить свое время запроса от 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; 

Я уверен, что должны быть способы, чтобы улучшить это еще и был бы признателен, если кто-то может помочь мне в этом С уважением.

С уважением

Саурабх

ответ

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. , , Кажется странным. Вы проверяете планы выполнения, но я ожидаю, что подзапрос будет оптимизирован. Индекс должен повысить производительность. –

Смежные вопросы