У меня есть таблица с основным столбцом идентификатора (автоматически индексированная), два столбца поддилета (также индексированные) и 12 столбцов геометрии типа (многоугольник). Если я собираюсь обновить ~ 2 миллиона строк в этой таблице, является его быстрее, для меня, чтобы запустить ~ 2 миллионов отдельных операторов обновления, какСкорость многих отдельных обновлений по сравнению с одним большим обновлением
update TABLE_NAME set (COLUMNS) = (VALUES) where ID_COLUMN = NEXT_ID
или это быстрее, чтобы сделать некоторые меньшее количество крупных операторов обновления, как в это answer
update TABLE_NAME as update_t set
COLUMNS = new_vals.COLUMNS
from (values
(id, polygon1val, polygon2val, ... polygon12val), /* row 1 */
(id, polygon1val, polygon2val, ... polygon12val), /* row 2 */
... /* ... */
(id, polygon1val, polygon2val, ... polygon12val) /* row N */
) as new_vals(COLUMNS)
where new_vals.id = update_t.id
В последнем случае у вас есть какие-либо предложения о том, что хороший N
может быть? Есть N
= ~ 2mil или какое-то меньшее подмножество (что я бы повторил, пока они все не закончили)?
EDIT: Очевидно, что в первом случае я бы использовал подготовленное заявление. Но я также удивляюсь, в последнем случае есть ли какая-либо польза в попытке использовать подготовленное заявление?
Я использую PostgreSQL 9.2.
Re Хорошая ценность 'N': обычно нет ограничений, ниже которых отдельные операторы лучше, но выше определенной зависимости от рабочей нагрузки можно создать временную таблицу,' КОПИРОВАТЬ данные в нее, и создавая любые полезные индексы в таблице, а затем выполняем объединенное обновление по таблице temp. PostgreSQL не знает, как материализовать и индексировать список VALUES, когда это делается быстрее. –