Каков самый быстрый способ вставить огромный массив (10 миллионов элементов) из приложения С#?
До сих пор я использовал объемную вставку. Приложение C# создает большой текстовый файл, и я загружаю его с помощью команды BULK INSERT
. Из любопытства я написал простую определяемую пользователем функцию табличного значения CLR.
[SqlFunction(Name = "getArray", FillRowMethodName = "FillRow")]
public static IEnumerable getArray(String name)
{
return my_arrays[name]; // returns the array I want to insert into db
}
public static void FillRow(Object o, out SqlDouble sdo)
{
sdo = new SqlDouble((double)o);
}
И этот запрос:
INSERT INTO my_table SELECT data FROM dbo.getArray('x');
Работает почти в 2 раза быстрее объемного аналога. Точные результаты:
BULK - 330с (запись на диск + вставка) TVF - 185с
Конечно, это связано с накладными расходами на запись, но я не знаю, есть ли у BULK-вставки какой-либо эквивалент в памяти.
Итак, мой вопрос - лучше ли TVF по сравнению с BULK (который создан для огромных вставок), или я что-то здесь упускаю. Есть ли какая-то третья альтернатива?