Импорт SQL Server быстрее, чем массовый импорт

У меня есть большой (~ 50 ГБ, ~ 300 млн строк) файл, разделенный вкладками, который я хочу импортировать в таблицу SQL Server со столбцами: char(10), varchar(512), nvarchar(512), nvarchar(512).

Массовый импорт с использованием T-SQL, SSIS или C# занимает около дня SqlBulkCopy.

Есть ли более быстрый способ загрузить эти данные?

Или может быть какое-то условие, замедляющее его, которое я могу удалить или изменить?


person Egor Antonov    schedule 16.10.2012    source источник
comment
Массовый импорт — самый быстрый способ   -  person AntLaC    schedule 16.10.2012
comment
Массовая вставка, безусловно, самая быстрая. Звучит как возможные ограничения памяти или ввода-вывода, так как я загрузил большие наборы за гораздо меньший период времени. Можно ли разделить файл и загрузить его в разделы параллельно?   -  person Data Masseur    schedule 16.10.2012
comment
Вы уже следовали советам в документации по оптимизации массового импорта? А какая у вас версия SQL Server?   -  person Pondlife    schedule 17.10.2012


Ответы (3)


Если вы выполняете вставку в существующую таблицу, удалите все индексы перед импортом и заново создайте их после импорта.

Если вы используете SSIS, вы можете настроить размер пакета и фиксации.

Убедитесь, что на сервере достаточно памяти для такого большого объема данных.

Выполнить операцию загрузки на локальном сервере (копировать файл локально, не загружать по сети).

Настройте параметры автоматического увеличения целевой базы данных и журнала транзакций на разумное значение, например несколько сотен МБ фрагментов за раз (по умолчанию обычно используется увеличение на 1 МБ для основного файла данных .mdf). Операции роста медленные/дорогие, поэтому вы хотите свести их к минимуму.

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

person Alf47    schedule 16.10.2012

Я только что провел последние несколько недель, борясь с оптимизацией очень большой нагрузки. BULK INSERT — это самый быстрый способ, который я нашел с BCP, в отличие от SSIS или TSQL Bulk Insert, но есть вещи, которые вы можете сделать, чтобы настроить его.

  • Попробуйте увеличить/уменьшить количество строк для каждого пакета, чтобы переместить нагрузку на ресурсы между ЦП и памятью (чем выше, тем меньше ЦП, чем меньше — меньше памяти).
  • Если есть кластеризованный индекс или некластеризованные индексы, удалите их и создайте заново после вставки.
  • Разделите TSV на более мелкие файлы с помощью инструмента .NET, а затем параллельно загрузите их в таблицу. Для этого требуется, чтобы таблица была кучей (кластеризованный индекс удален)
  • Убедитесь, что он минимально зарегистрирован. Для кучи это требует TABLOCK, для кластеризованного индекса требуется флаг трассировки 610 и требуется, чтобы халат данных был упорядочен так же, как ключ кластеризованного индекса. В любом случае потребуются модели восстановления SIMPLE или BULK LOGGED.
person Pete Carter    schedule 16.10.2012

Вы пытались загружать данные параллельно? Вот простое решение SSIS:

1) Установите генератор номеров строк SSIS (http://www.konesans.com/products/row-number-transformation.aspx) 2) Создайте пакет SSIS для чтения файла. 3) В задаче потока данных прочитать исходный файл. 4) В задаче потока данных вставьте генератор номеров строк. 5) В задаче потока данных вставьте условное разбиение, используя номер строки и создав несколько потоков (т. е. номер строки % 3 == 0, номер строки % 3 == 1, номер строки % 3 == 2). 6) В задаче потока данных вставьте целевую таблицу назначения.

Надеюсь это поможет.

person Patrick    schedule 17.07.2013