2017-02-01 7 views
0

Удивительно, если есть способ сделать инструкцию SQL ниже быстрее.Как ускорить это заявление о обновлении

UPDATE table_one SET column_x = table_two.column_x FROM table_two 
WHERE table_one.column_y = table_two.column_y; 

В настоящее время указанный запрос ведется более 3 часов. Любые предложения о том, как сделать это быстрее?

Детали:

  • table_one Досталось 190 миллионов записей
  • table_two получил 390 миллионов записей
  • column_x и column_y в обеих таблицах являются целыми числами.
  • column_y в обеих таблицах индексируется

Am работает на виртуальной машине с 120 Гб оперативной памяти и 22 Ядра с Postgresql 9.3.

+0

Вопрос, имеет ли смысл пункт 'WHERE'? то есть, если мы сказали 'table_two.column_y = table_one.column_y' вместо' table_one.column_y = table_two.column_y'? – lukik

+0

Если мое предложение не поможет вам, и вы все еще ищете решение, добавьте результат объяснения анализа выполнения вашей команды. –

ответ

3

Вам не нужно обновить все записи, по крайней мере:

UPDATE table_one 
     SET column_x = table_two.column_x 
    FROM table_two 
     WHERE table_one.column_y = table_two.column_y 
     AND table_one.column_x != table_two.column_x; 

Кроме того, вероятно, может помочь, чтобы создать индекс для обоих поля х и у для обеих таблиц.

+0

Я понимаю, что неиндексированный столбец обрабатывал вставки/обновления быстрее, чем индексированный, поэтому причина оставляя table_one.column_x Un-Indexed с момента его обновления. – lukik

+0

Но и эта конструкция, вероятно, может использовать «индекс only 'scan –

+0

В этом случае я обновляю все записи, потому что я убедился, что все записи в таблице table_one * - таблице, которую мы обновляем, - *, содержатся в 'table_two' * - таблице, которую мы обновляем из- *. Так будет ли ваше предложение «вам не нужно обновлять все записи»? – lukik

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