Вставка / обновление огромного количества строк в SQL Server с помощью C #

1

Мне нужно проанализировать большой XML файл и импортировать (вставлять/обновлять) его данные в различные таблицы с ограничениями внешнего ключа.

Поэтому я впервые подумал: я создаю список операторов вставки/обновления SQL и выполняю их все сразу, используя SqlCommand.ExecuteNonQuery().

Другой метод, который я нашел, был показан AMissico: Method, где я буду выполнять команды sql один за другим. Никто не жаловался, поэтому я считаю его жизнеспособной практикой.

Затем я узнал о SqlBulkCopy, но мне кажется, что мне нужно будет создать DataTable с данными, которые я хочу загрузить. Итак, SqlBulkCopy для каждой таблицы. Для этого я мог бы создать DataSet.

Я думаю, что каждый вариант поддерживает SqlTransaction. Это примерно 100-20000 записей за стол.

Какой вариант вы бы предпочли и почему?

Теги:
sql-server

2 ответа

0
Лучший ответ

Вы говорите, что XML уже находится в базе данных. Сначала решите, хотите ли вы обработать его на С# или в T-SQL.

  1. С#: вам нужно будет отправлять все данные назад и вперед один раз, но С# - гораздо лучший язык для сложной логики. В зависимости от того, что вы делаете, это может быть на порядок быстрее.
  2. T-SQL: нет необходимости копировать данные клиенту, но вы должны жить с возможностями и первичным профилем T-SQL.

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

Если вы хотите вычислить на С#, используйте один потоковый SELECT для чтения данных и одного SqlBulkCopy для его записи. Если ваши записи не являются вставками, пишите в временную таблицу и выполняйте как можно меньше инструкций DML, чтобы обновить целевую таблицу (возможно, один MERGE).

Если вы хотите остаться в T-SQL, сверните количество выполненных заявлений. Используйте логику на основе набора.

Все это упрощается/сокращается. Я упустил много соображений, потому что они слишком долго для ответа на переполнение стека. Имейте в виду, что лучшая стратегия зависит от многих факторов. Вы можете задать дополнительные вопросы в комментариях.

  • 0
    Я остаюсь с C #. Вы сказали, один SELECT. Вы имеете в виду один поток для чтения или просто нет подзапросов? Есть ли проблема для чтения в нескольких потоках, кроме проблем с синхронизацией?
  • 0
    Хорошо, я не прояснил этот момент. Я имел в виду, что вы должны избегать анти-паттерна выдачи одного SELECT на строку. Я вижу это много. Просто запросите все данные за один раз. Вы также можете читать по нескольким темам, если вы можете заставить это работать. Вам нужно как-то разделить данные, возможно, по диапазону идентификаторов. PLINQ очень хорош для этих вещей.
Показать ещё 1 комментарий
0

Не делайте этого с С#, если вам это не нужно, это огромные накладные расходы, и SQL может сделать это намного быстрее и лучше сам по себе

Вставка в таблицу из файла XML с помощью INSERT INTO SELECT

  • 0
    Документ XML действительно хранится в столбце XML. Я прочел бы определенные части документа XML и должен был бы сослаться на другие части документа, основываясь на этих других частях и так далее. Много ссылок. Также в некоторых случаях я должен решить, основываясь на значениях элементов XML, где они принадлежат. Это не простая структура, как в вашей ссылке.
  • 0
    Так почему же тогда вы не можете сохранить свой выходной XML?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню