2013-11-14 1 views
1

У меня есть таблица с основным столбцом идентификатора (автоматически индексированная), два столбца поддилета (также индексированные) и 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.

+0

Re Хорошая ценность 'N': обычно нет ограничений, ниже которых отдельные операторы лучше, но выше определенной зависимости от рабочей нагрузки можно создать временную таблицу,' КОПИРОВАТЬ данные в нее, и создавая любые полезные индексы в таблице, а затем выполняем объединенное обновление по таблице temp. PostgreSQL не знает, как материализовать и индексировать список VALUES, когда это делается быстрее. –

ответ

2

В целом, чем лучше вы можете выполнять операции по пакету, тем больше возможностей базы данных для быстрого создания. Если вы запускаете обновления по отдельности, единственным вариантом является «найти одну затронутую строку, удалить ее, вставить новую».

Если вы можете пакетно обновлять обновления, тогда планировщик принимает решение о том, может ли последовательное сканирование быстрее чем сканирование индексов (и это вполне может быть, так как вы можете использовать кэширование с чтением вперед). Другими словами, одна команда, обновляющая множество строк, почти всегда работает лучше, чем множество команд, обновляющих одну строку, даже в стороне от накладных расходов на планирование.

+0

Да, есть также время установки/отсрочки запроса, задержки клиент-серверного взаимодействия (даже на локальном хосте у вас есть переключение контекста и перепланировка) и т. Д. Большинство из них не исчезают с использованием подготовленных заявления. –

+0

Интересно. Мой опыт заключался в том, что отдельные обновления (или партии по 3-5) были быстрее. Интересно, что я делаю что-то неправильно. – caps

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