Является ли ROLLBACK TO SAVEPOINT более эффективным, чем ROLLBACK TRANSACTION? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть скрипт, который выполняет несколько обновлений для таблицы среднего размера (приблизительно 6 миллионов строк) на основе данных, прочитанных из файла.

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

Я посмотрел в Интернете, но мне не повезло поиск любой документации или тестов.

Ответы [ 2 ]

1 голос
/ 05 марта 2020

COMMIT является в основном проблемой ввода-вывода, поскольку журнал транзакций (WAL) необходимо синхронизировать с диском.

Таким образом, использование субтранзакций (точек сохранения) очень вероятно повысит производительность. Но имейте в виду, что использование более 64 субтранзакций на транзакцию снова приведет к снижению производительности, если у вас есть параллельные транзакции.

Если вы можете потерять некоторые зафиксированные транзакции в случае сервера базы данных cra sh (что редко ), вы можете просто установить synchronous_commit на off и придерживаться множества небольших транзакций.

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

1 голос
/ 05 марта 2020

Наличие одной транзакции только с 1 COMMIT должно быть быстрее, чем наличие нескольких транзакций обновления одной строки, поскольку каждый COMMIT должен синхронизировать запись WAL на диск. Но насколько он быстрее в данной среде, зависит от среды (количество транзакций, структура таблицы, структура индекса, оператор UPDATE, конфигурация PostgreSQL, конфигурация системы и т. Д. c.): Только вы можете тестировать в своем тесте окружающая среда.

...