Быстрый массовый insert данных.
Одной из часто встречаемых проблем при работе с данными, является скорость вставки большого количества строк в таблицы баз данных. Можно использовать построчную вставку в цикле, но например для MySQL достаточно быстро выполнится insert с множественным указанием значений values, например :
insert into tablename(field1,field2) values(val11,val12) ,(val21,val22),(val31,val32),…
Быстрее такая вставка проходит потому, что сервер лишь один раз перестраивает индексы, вместо их перестроения после вставки каждой строки.
Для SQL Server подобное можно осущестить с помощью UNION, но скорость такой вставки в SQL Server меня не впечатлила. Построчные вставки(в цикле) лучше проводить сначала во временную таблицу без индекса, выполняя потом вставку данных из временной таблицы в нужную таблицу:
insert into tablename (field1,field2) select t.field1 t.field2 from temptable t
при этом выполнится лишь одно перестрение индекса, вместо их большого количества при посрочной вставке. При большом количестве индексов, способ вставки через временную таблицу может очень существенно сократить общее время вставки данных по сравнению с построчной вставкой прямо в таблицу.
В MySQL можете воспользоваться «LOAD DATA INFILE», позволяющий загрузить данные из форматированного файла. Подробнее тут.
Для по-настоящему быстрой вставки данных на SQL Server, рекомендую пользоваться BULK INSERT, если есть возможность.
На С#, подобную вставку можно легко осуществить с помощью класса SqlBulkCopy.
Дам простой пример, наглядно показывающий простоту использования:
//объявиляем класс, передавая параметром SqlConnection
SqlBulkCopy bulka = new SqlBulkCopy(conn);
//таймаут на выполнение вставки в секундах
bulka.BulkCopyTimeout = 300;//указываем таблицу базы данных, в которую будет производиться вставка данных
bulka.DestinationTableName = «##temptbl» ;//запускаем встаку, передавая как параметр DataTable
bulka.WriteToServer(imports);
при этом поля переменной imports и таблицы сервера ##temptbl совпадают. Если же они не совпадают, то вы можете провести соответствия полей передав свойству ColumnMappings объекта bulka, объект типа SqlBulkCopyColumnMappingCollection, в котором вы укажите из какого в какое поле нужно вставлять данные.
В качестве параметра bulka.WriteToServer(param) можно передать DataRow[] и прочие параметры.
В общем, класс достаточно продуман, гибок и прост в использовании.
Если все эти варианты не подходят, как дополнительный вариант, можете создать на сервере хранимую процедуру, входящим параметром для которой будет, например varchar(5000), что по сути упакованные через какой либо разделитель значения строк. Процедура будет разбирать этот параметр формируя запрос для вставки. Как с ним поступать дальше решите сами.
Рассмотрены, естественно далеко не все способы. Если желаете дополнить, оставляйте комментарии.