Быстрый массовый insert данных.

Одной из часто встречаемых проблем при работе с данными, является скорость вставки большого количества строк в таблицы баз данных. Можно использовать построчную вставку в цикле, но например для достаточно быстро выполнится insert с множественным указанием значений values, например :

insert into tablename(field1,field2) values(val11,val12) ,(val21,val22),(val31,val32),…

Быстрее такая вставка проходит потому, что сервер лишь один раз перестраивает индексы, вместо их перестроения после вставки каждой строки.

Для подобное можно осущестить с помощью UNION, но скорость такой вставки в меня не впечатлила. Построчные вставки(в цикле) лучше проводить сначала во временную таблицу без индекса, выполняя потом вставку данных из временной таблицы в нужную таблицу:

insert into tablename (field1,field2) select t.field1 t.field2 from temptable t

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

В MySQL можете воспользоваться «LOAD DATA INFILE», позволяющий загрузить данные из форматированного файла. Подробнее тут.

Для по-настоящему быстрой вставки данных на SQL Server, рекомендую пользоваться BULK INSERT, если есть возможность.

На С#, подобную вставку можно легко осуществить с помощью класса .

Дам простой пример, наглядно показывающий простоту использования:

//объявиляем класс, передавая параметром SqlConnection

SqlBulkCopy bulka = new SqlBulkCopy(conn);

//таймаут на выполнение вставки в секундах
bulka.BulkCopyTimeout = 300;

//указываем таблицу базы данных, в которую будет производиться вставка данных
bulka.DestinationTableName = «##temptbl» ;

//запускаем встаку, передавая как параметр
bulka.WriteToServer(imports);

при этом поля переменной imports и таблицы сервера ##temptbl совпадают. Если же они не совпадают, то вы можете провести соответствия полей передав свойству ColumnMappings  объекта bulka, объект типа SqlBulkCopyColumnMappingCollection, в котором вы укажите из какого в какое поле нужно вставлять данные.

В качестве параметра bulka.WriteToServer(param) можно передать DataRow[] и прочие параметры.

В общем, класс достаточно продуман, гибок и прост в использовании.

Если все эти варианты не подходят, как дополнительный вариант, можете создать на сервере хранимую процедуру, входящим параметром для которой будет, например varchar(5000), что по сути упакованные через какой либо разделитель значения строк. Процедура будет разбирать этот параметр формируя запрос для вставки. Как с ним поступать дальше решите сами. :)

VN:F [1.9.13_1145]
Rating: 10.0/10 (1 vote cast)
Быстрый массовый insert данных. , 10.0 out of 10 based on 1 rating

Читайте также:

  1. admin
    11 Август 2009 в 14:40 | #1

    Рассмотрены, естественно далеко не все способы. Если желаете дополнить, оставляйте комментарии.

    VN:F [1.9.13_1145]
    Rating: 5.0/5 (1 vote cast)
  1. 26 Август 2009 в 00:07 | #1