Массовая вставка на сервер 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 хранит ее, возвращает результат, а затем вы должны перебирать следующую строку.

Ответ 5

Там также хранится proc (называемый Bulk Insert), который сделает трюк для вас. Он использует bcp под обложками.

ознакомьтесь с этой ссылкой, чтобы увидеть синтаксис

текст ссылки

Ответ 6

Это зависит от того, как реализуется класс массовой копии. Но есть инструмент командной строки, который входит в комплект установки SQL Server, который делает именно это (это, вероятно, то же самое). Он называется "bcp". Я использую его прямо сейчас, и он должен уметь штурмовать через 100 тыс. Строк за считанные секунды.

Документация MSDN относится к ней как к утилите "массового импорта".