Если вы используете отдельную транзакцию для каждой вставки, это определенно повлияет на производительность, поскольку сервер БД должен будет атомарно выполнять каждую вставку. Я никогда не использовал SQL-сервер, но в большинстве вариантов SQL есть способ объединить более одной вставки в одну транзакцию, обычно с чем-то вроде
BEGIN TRANSACTION;
...<various SQL statements>...
COMMIT TRANSACTION;
Синтаксис сервера SQL см .:
http://msdn.microsoft.com/en-us/library/ms188929.aspx
http://msdn.microsoft.com/en-us/library/ms190295.aspx
По моему опыту, объединение таких вставок определенно помогает повысить производительность сервера и, в некоторой степени, использование ресурсов и сети.
EDIT:
Большинство (все?) Приличных серверов БД используют какую-то блокировку для каждой строки, а не для каждой таблицы. Вы должны иметь возможность иметь несколько параллельных транзакций, каждая с несколькими вставками, без проблем - это то, для чего предназначены серверы БД. Конечно, каждый рабочий поток может выполнять свои собственные транзакции, распараллеливая вставки из разных потоков.
Поскольку вы, очевидно, используете один компьютер для вычислений и БД, интенсивное распараллеливание транзакций БД не сильно повлияет на производительность и может даже ухудшить ситуацию, поскольку у вас нет задержек в сети, чтобы уменьшить влияние из. Пока все ядра процессора заняты, что, вероятно, подразумевает количество рабочих>> 12, вы должны смотреть на другие оптимизации.
Если ваши потоки генерируют свои выходные данные за один раз после обработки (например, если вы вычисляете большую матрицу и , то сбрасываете в базу данных) Я сомневаюсь, что вы получите что-нибудь, сохранив результат в файл и затем с БД считывает его обратно в таблицу.
Если, с другой стороны, ваши потоки выполняют свой вывод по частям, вы могли бы выиграть, сохранив части своего вывода в памяти, а затем вставив эти части в БД, выполняя более одной транзакции за раунд. Увеличение числа рабочих потоков в этом случае может позволить вам лучше использовать ЦП, пока БД хранит данные, , если ЦП используется недостаточно.
ИМХО следует избегать сохранения рабочего вывода в файле, поскольку он эффективно увеличивает нагрузку на дисковую подсистему в три раза. Единственная причина, по которой вы можете захотеть сделать это, - если у вас действительно нет памяти для промежуточного хранения результатов.