Массовая вставка на сервер Sql
Я пытаюсь вставить массу записей в SQL Server 2005 из Vb.Net. Хотя вставка работает нормально, я прилагаю все усилия, чтобы попытаться сделать это как можно быстрее. В настоящее время требуется около 11 минут для 100 000 записей. Каким будет предлагаемый подход для вставки большого количества записей в SQL Server из приложения?
Мой текущий apporach в основном открывает соединение, повторяя мой список информации и снимая отдельные записи вставки sql, а затем закрывая соединение. У кого-нибудь есть лучшее предложение о том, как это сделать?
Текущая функция:
Public Sub BatchInsert(ByVal ParamCollections As List(Of SqlParameter()))
Dim Conn As SqlConnection = New SqlConnection(DBHelper.DatabaseConnection)
Using scope As TransactionScope = New TransactionScope()
Using Conn
Dim cmd As SqlCommand = New SqlCommand("sproc_name", Conn)
Conn.Open()
cmd.CommandType = CommandType.StoredProcedure
For i = 0 To ParamCollections.Count - 1
cmd.Parameters.Clear()
cmd.Parameters.AddRange(ParamCollections(i))
cmd.ExecuteNonQuery()
Next
Conn.Close()
scope.Complete()
End Using
End Using
End Sub
Ответы
Ответ 1
Используйте класс SqlBulkCopy, он сможет работать через эти строки 100K намного быстрее, чем отдельные вставки.
О, и если вы можете, я бы настоятельно рекомендовал вам реализовать класс IDataReader для подачи SqlBulkCopy.WriteToServer(IDataReader), это позволит вам производить данные последовательно, по одной строке за раз. Если вы импортируете из текстового файла, в качестве примера создаете несколько методов IEnumerable<T>
, которые используют yield return
и преобразуют его в IDataReader позволяет вам правильно передавать данные на сервер.
Чтобы предотвратить потерю способности отката с помощью BCP, вы можете перенести данные во временную таблицу, а затем выполнить обычные операторы INSERT INTO
на сервере, передавая данные из временной таблицы в производственную таблицу, это позволит вам использовать транзакцию для последней части передачи и будет работать намного быстрее, чем исходные отдельные инструкции вставки.
EDIT: и Здесь пример (С#, но должен быть легко конвертирован в VB.Net) использования API с объемной загрузкой.
Ответ 2
Благодаря каждой помощи, я смог выполнить свою задачу. SQLBulkCopy отлично подойдет моим потребностям (хотя были и другие отличные предложения). Используя SqlBulkcopy, время шло от 11 минут до 45 секунд. Я не могу поверить в разницу!
Для справки в будущем, вот несколько бит информации:
- Чтобы использовать SQL Bulk Copy, ваши данные должны быть в виде DataSet, DataReader или DataTable. Некоторые XML также разрешены.
Основной код реализации:
Public Sub PerformBulkCopy(ByVal dt As DataTable)
Using Conn As SqlConnection = New SqlConnection(DBHelper.DatabaseConnection)
Conn.Open()
Using s As SqlBulkCopy = New SqlBulkCopy(Conn)
s.DestinationTableName = "TableName"
s.WriteToServer(dt)
s.Close()
End Using
Conn.Close()
End Using
End Sub
Очень информативная ссылка, которую я нашел:
Использование Sql Bulk Copy
Спасибо всем за помощь! Я искренне ценю это.
Ответ 3
Поместите ваши данные для импорта в файл csv и запустите утилиту bcp на данных. Вы не можете получить быстрее с последовательными вызовами, вставляя по одной строке за раз, вам, разумеется, нужна большая утилита, если вам нужна производительность.
Класс SQLBulkCopy позволит вам передавать все данные в коллекции, чтобы сервер мог обрабатывать все сразу, устраняя их назад и вперед. Поэтому, если вы хотите избежать создания временных файлов (что я хотел бы), тогда посмотрите на этот класс.
Простое соединение остается открытым, это хороший старт, но у вас все еще есть накладные расходы на отправку строки, где SQL хранит ее, возвращает результат, а затем вы должны перебирать следующую строку.
Ответ 4
здесь приведены некоторые сравнения скорости различных методов импорта текстовых файлов в sql-сервер:
http://weblogs.sqlteam.com/mladenp/archive/2006/07/22/10742.aspx
надеюсь, что это поможет.
Ответ 5
Там также хранится proc (называемый Bulk Insert), который сделает трюк для вас. Он использует bcp под обложками.
ознакомьтесь с этой ссылкой, чтобы увидеть синтаксис
текст ссылки
Ответ 6
Это зависит от того, как реализуется класс массовой копии. Но есть инструмент командной строки, который входит в комплект установки SQL Server, который делает именно это (это, вероятно, то же самое). Он называется "bcp". Я использую его прямо сейчас, и он должен уметь штурмовать через 100 тыс. Строк за считанные секунды.
Документация MSDN относится к ней как к утилите "массового импорта".