Какой самый быстрый способ вставить огромный массив (10M элементов) из приложения C #?
До сих пор я использовал массовую вставку.Приложение 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 (который создан для огромных вставок), или я что-то здесь упускаю.Есть ли третий вариант?