Редактировать
В ретроспективе, используя Parallel.ForEach
распараллелить DB вставки немного расточительно, так как он также будет потреблять поток для каждого подключения. Возможно, еще лучшим параллельным решением будет использование асинхронных версий операционных операций System.Data
, таких как ExecuteNonQueryAsync, запуск выполнения (одновременно), а затем использование await Task.WhenAll()
для ожидания по завершении - это позволит избежать накладных расходов Thread для вызывающего абонента, хотя общая производительность Db вряд ли будет более быстрой. More here
Оригинал ответа, множественные параллельные вставки в базу данных
Вы можете сделать это параллельно с использованием TPL, например, особенно с перегрузкой localInit
Parallel.ForEach. Вы почти наверняка хотите посмотреть на дросселирование количество параллельности щипая MaxDegreeOfParalelism, так что вы не затопит вашу базу данных:
Parallel.ForEach(dt.Rows,
// Adjust this for optimum throughput vs minimal impact to your other DB users
new ParallelOptions { MaxDegreeOfParallelism = 4 },
() =>
{
var con = new SqlConnection();
var cmd = con.CreateCommand();
cmd.CommandText = sql_proc;
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
// NB : Size sensitive parameters must have size
cmd.Parameters.Add(new SqlParameter("@b", SqlDbType.VarChar, 100));
cmd.Parameters.Add(new SqlParameter("@c", SqlDbType.Bit));
// Prepare won't help with SPROCs but can improve plan caching for adhoc sql
// cmd.Prepare();
return new {Conn = con, Cmd = cmd};
},
(dr, pls, localInit) =>
{
localInit.Cmd.Parameters["@a"] = dr["a"];
localInit.Cmd.Parameters["@b"] = dr["b"];
localInit.Cmd.Parameters["@c"] = dr["c"];
localInit.Cmd.ExecuteNonQuery();
return localInit;
},
(localInit) =>
{
localInit.Cmd.Dispose();
localInit.Conn.Dispose();
});
Примечания:
- Если вы не знаете, что вы В целом мы должны оставить TPL, чтобы определить степень параллелизма. Тем не менее, в зависимости от того, сколько конфликтов (чтение: блокировки для работы с базой данных) для ресурсов, может потребоваться ограничение верхнего предела одновременных задач (пробная версия и ошибка могут быть полезны, например, попробовать с совпадениями 4, 8, 16 одновременных задач и т. Д. см., что дает большую пропускную способность и контролирует загрузку и загрузку процессора на вашем сервере Sql.
- Аналогичным образом, оставляя по умолчанию разделитель по умолчанию TPL, как правило, достаточно хорош, чтобы разбить DataRows на задачи.
- Для каждой задачи потребуется отдельная Sql Подключение
- Вместо того, чтобы создавать и удалять команду для каждого вызова, создайте его один раз для каждой задачи и затем повторно используйте одну и ту же команду, просто обновляя параметры каждый раз.
- Используйте LocalInit/Local Last lambdas для настройки и очистки задачи, например, для удаления команд и соединений.
- Вы также могли бы рассмотреть вопрос об использовании
.Prepare()
, если вы используете AdHoc Sql или Sql versions prior to 2005
- Я предполагаю, перечислив
DataTable's
строк является поточно. Конечно, вы захотите дважды проверить это.
Сторона Примечание:
10 минут для 3000 строк является чрезмерным, даже с широким столом и в одном потоке. Что делает ваш пророк?Я предположил, что обработка не является тривиальной, отсюда и необходимость в SPROC, но если вы просто делаете простые вставки, как следует из комментария @ 3dd, SqlBulkCopy будет давать вставки ~ 1M строк в минуту на достаточно узкой таблице.
Просто из любопытства - почему вы добавления 3000 строк в базу данных с помощью хранимой процедуры? если это из какого-либо входного файла, почему бы не импортировать его непосредственно в базу данных с помощью какого-либо инструмента управления? – ShayD
Данные о данных заполняются из другой базы данных - основной базы данных. Моя цель - извлечь данные из основной базы данных и вставить их в мою базу данных. Хранимая процедура используется для вставки данных в мою базу данных. – Harsh
Почему бы не использовать объемную вставку или сервер ссылок, а также получить SQL-выборку и вставить данные. – 3dd