Действия для запроса SQL-сервера или хранимой процедуры для заполнения партии данных

Это - вопрос для SQL Server код.NET и 2008.

Я задаюсь вопросом, что Вы думаете с точки зрения действий, дизайна между этими двумя опциями вставить много данных (> 250 000 строк, 5 “нормальных” столбцов) в таблицу с помощью транзакции.

  • a. Вставьте оператор Into, окруженный, проводят оператор в коде c#.

Или

  • b. Вставьте оператор Into в выполняемую строку строкой хранимой процедуры некоторое время в коде c#, окруженном проводить оператором.

Или

  • c. Сериализируйте мой объект в c# и отправьте xml в хранимую процедуру. Хранимая процедура некоторое время, что читает xml. В то время как окружается проводить оператором.

Кроме того, сеть между клиентом и сервером не очень хороша...

Заранее спасибо.

1
задан Dan 12 July 2010 в 11:44
поделиться

2 ответа

Поскольку вы уже позаботились о пакетной фиксации, следующей проблемой будет возврат к клиенту и обратно. Чем меньше запросов, тем лучше. Итак, первые два варианта были бы довольно плохими, поскольку каждый отправляет одну строку на запрос и должен выполнять 250 тыс. Циклов приема-передачи. Вариант 3 является жизнеспособным, особенно если обработка XML задана как ориентированная (спроецировать XML в таблицу с помощью метода .nodes () и вставить всю проецируемую таблицу). См. Также Как сериализовать большой граф .NET-объекта в BLOB-объект SQL Server без создания большого буфера , чтобы узнать, как отправить большой XML-код в SQL без огромных выделений памяти на клиенте.

Другой вариант, который вы не упомянули, но уже указали: используйте SqlBulkCopy . Это был бы самый быстрый способ по многим причинам. Единственная проблема заключается в том, что вы должны выдержать способ представления строк для массового копирования с использованием семантики потоковой передачи (возврат IEnumerable), чтобы избежать выделения больших объемов памяти на клиенте.

0
ответ дан 2 September 2019 в 23:07
поделиться

Как всегда, вы должны профилировать свой код, но я бы рекомендовал вам рассмотреть возможность использования класса SqlBulkCopy.

2
ответ дан 2 September 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: