Операции вставки в БД медленнее при использовании параллельного foreach, чем обычного foreach - PullRequest
0 голосов
/ 03 августа 2011

У меня есть функция, которая просматривает мой список объектов, проверяет их и сохраняет в БД SQL-сервера.

Количество объектов, которые я должен сохранить, может составлять десятки тысяч, поэтому я решилиспользовать параллельные рамки, чтобы сделать это быстрее.Для этого я использую параллель.Например, в моем последнем тесте список моих объектов обрабатывается за 2: 41.35 минут, обычный foreach делает это за 2: 14.92.Разница составляет почти полминуты.

Это обычное поведение для операций вставки БД в параллельной структуре?Рекомендуется ли использовать параллельный .foreach для выполнения операций вставки БД?

Thx!

VS2010 / .Net4 / c #

1 Ответ

2 голосов
/ 03 августа 2011

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

Кстати, вы сохраняете все эти объекты в БД в одной транзакции или у вас просто включен автокоммит? Конечно, это зависит от того, какие ограничения целостности применяются к вашим вставкам, но 2-3 минуты кажутся большими, даже для десятков тысяч строк. Мудрое использование транзакций, если вы не используете его в настоящий момент, может значительно повысить производительность.

Отредактировано для добавления : Используя SQLite на моем настольном компьютере, я могу вставить 100 строк из 1 поля за 5 секунд, используя автокоммит. Я могу вставить 10000 строк из 1 поля за 13 секунд, если они находятся в одной транзакции.

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