Большие вставки SQL TVF против вставки BULK - PullRequest
4 голосов
/ 30 июня 2011

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

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

Я использую SqlBulkCopy , когда мне действительно нужно самое последнее падение производительности, так что вы можете пропустить накладные расходы, сначала поместив все это на диск.

SqlBulkCopy принимает IDataReader, который вы должны реализовать, но только несколько методов интерфейса.Я всегда просто создаю class MyBulkCopySource : IDataReader, нажимаю «Реализовать интерфейс» и передаю его в BulkCopy, чтобы увидеть, какой метод вызывается.Реализуйте это, попробуйте снова и т. Д. Вам нужно реализовать только три из четырех, остальные никогда не будут вызваны.

AFAIK - это самый быстрый способ перекачки данных из программы на C # в SqlDB.

ГДж

2 голосов
/ 30 июня 2011
  • Использовать SqlBulkCopy
  • Из нескольких потоков с блоками, например, 30 000 строк каждый раз.
  • НЕ в итоговую таблицу, а во временную таблицу
  • Из которойВы копируете, используя настройку соединения, которая не учитывает блокировки.

Это полностью помещает наименьшую блокировку в конечную таблицу.

...