Лучше совершать внутри или снаружи цикла? - PullRequest
4 голосов
/ 08 октября 2010

Может быть, нет простого ответа на этот вопрос, но я спрашиваю, если у кого-то есть, если не простой ответ, по крайней мере, понимание.

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

Есть ли конкретный случай, который лучше?

Что напоминает мне, что у меня была одна такая программа,недавно он переключился с одного большого коммита на кучу небольших коммитов, потому что это была довольно долго работающая программа - около 80 минут - и она провалилась на половине неверных данных.Я исправил проблему и перезапустил ее, но затем она должна была начаться заново с самого начала, когда я мог просто обработать ранее необработанные записи.

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

Ответы [ 3 ]

3 голосов
/ 08 октября 2010

Предполагая, что возможность отката всей персистентности не требуется (в этом случае есть только один ответ; фиксация снаружи), фиксация внутри цикла уменьшает размер журнала транзакций, но требует большего числа обращений к БД.Фиксация вне цикла - полная противоположность.Что быстрее, зависит от среднего количества операций и объема данных, которые будут зафиксированы в целом.Для подпрограммы, которая содержит около 10-20 записей, зафиксируйте вне цикла.Для записей 1–2 м я буду фиксировать партии.

1 голос
/ 08 октября 2010

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

0 голосов
/ 08 октября 2010

С точки зрения производительности, обычно лучше сделать один большой коммит в конце (пусть сетевой трафик, как правило, меньше работает для БД).

Это, конечно, зависит от многих факторов, таких как индексирование таблицы, объем данных и т. Д.

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

Ответ на эти вопросы даст вам правильный способ сделать это в вашем приложении для этого процесса - вы можете прийти к различным способам обработки фиксации в зависимости от контекста приложения.

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