Подтвердить что ты не робот

Максимальный размер транзакции в PostgreSQL

У меня есть утилита в моем приложении, где мне нужно выполнить массовую загрузку операций INSERT, UPDATE & DELETE. Я пытаюсь создать транзакцию вокруг этого, чтобы после того, как эта система была вызвана и данные были переданы ей, было гарантировано, что она либо полностью, либо вообще не добавлена в базу данных.

Беспокойство вызывает то, что граничные условия здесь? Сколько INSERT, UPDATE & DELETE я могу иметь в одной транзакции? Можно ли настраивать размер транзакции?

4b9b3361

Ответ 1

Я не думаю, что существует максимальный объем работы, который может быть выполнен в транзакции. Данные продолжают добавляться в файлы таблицы, и в итоге транзакция либо совершает, либо откатывает назад: AIUI этот результат сохраняется в pg_clog; если он откатывается назад, пространство в конечном итоге будет восстановлено вакуумом. Таким образом, это не так, как если бы текущая транзакционная работа хранилась в памяти и, например, была сброшена в момент фиксации.

Ответ 2

Одна транзакция может запускать в ней приблизительно два миллиарда команд (2 ^ 31, минус IIRC - небольшая часть накладных расходов. На самом деле, подумайте об этом, это может быть 2 ^ 32 - командный счетчик беззнаковый, я думаю).

Каждая из этих команд может, конечно, модифицировать несколько строк.

Ответ 3

Для проекта, над которым я работаю, я выполняю 20 миллионов INSERT. Я пробовал с одной большой транзакцией и с одной транзакцией за каждый миллион INSERT, и выступления кажутся точно такими же.

PostgreSQL 8.3

Ответ 4

Я считаю, что максимальный объем работы ограничен размером вашего файла журнала. База данных никогда не позволит себе отказываться от отката, поэтому, если вы потребляете все пространство журнала во время транзакции, оно будет остановлено, пока вы не дадите ему больше места или отката. Это обычно верно для всех баз данных.

Я бы порекомендовал chunking ваших обновлений в управляемые куски, которые занимают не более пары минут времени выполнения, так что вы знаете, есть ли проблема раньше (например, что обычно занимает 1 минуту, все еще работает через 10 минут... hmmm, кто-то сбросил индекс?)