Производительность по запросу или хранимой процедуре сервера Sql для заполнения большого количества данных - PullRequest
1 голос
/ 12 июля 2010

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

Мне интересно, что вы думаете с точки зрения производительности, рассчитайте между этими двумя вариантами вставку большого количества данных (> 250 000 строк, 5 «обычных» столбцов) в таблицу с использованием транзакции.

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

Или

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

Или

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

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

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

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

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

0 голосов
/ 12 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...