Какой самый быстрый способ вставить миллионы строк в таблицу SQL в этом случае? - PullRequest
0 голосов
/ 08 апреля 2019

Сценарий дела следующий.Через C # я вынужден вызывать хранимую процедуру на внешнем сервере, который возвращает 50 миллионов записей каждый раз, когда она вызывается.Каждая запись состоит из нескольких полей, разделенных запятыми, которые я должен разделить и вставить в таблицу базы данных на другом сервере.Поскольку записи должны быть обработаны перед вставкой, я думаю, что использование SqlBulkCopy должно быть исключено, так как при этом данные в таблице поступления будут записаны в том виде, в котором они есть, а не разделены.Сохранение всех записей в массиве запрещено, поскольку оперативной памяти компьютера, на котором будет работать .exe, недостаточно для этой цели.Есть идеи?

1 Ответ

1 голос
/ 09 апреля 2019

Класс SqlBulkCopy может передавать DataReader

Это означает, что вы можете создать пользовательский DataReader, который будет инкапсулировать DataReader, из которого поступают данные.

Использование пользовательского DataReader позволит вам обрабатывать данные построчно и выполнять любое форматирование или другие вещи, необходимые вашему приложениюперед тем как SqlBulkCopy скопирует данные из него.

Используя EnablesStreaming = true, он гарантирует, что в памяти останется только небольшой объем данных.

Вы предлагаете мне реализоватьинтерфейс IDataReader?

Да, так как вам нужно обработать данные перед вставкой.И вам нужно выполнить потоковую передачу, чтобы вы не могли загрузить все в память.

Вот как на самом деле работают некоторые из моих библиотек о массовой вставке, такие как:

Под капотом мы используем пользовательский IDataReader для доступа и обработкиюридические лица.

...