Insert sql: SQL INSERT INTO Statement

Сервер

sql. Каков самый быстрый способ вставки большого количества строк?

спросил

Изменено
4 года назад

Просмотрено
135 тысяч раз

У меня есть база данных, в которой я загружаю файлы в промежуточную таблицу, из этой промежуточной таблицы у меня есть 1-2 соединения для разрешения некоторых внешних ключей, а затем вставка этих строк в итоговую таблицу (которая имеет один раздел в месяц). У меня около 3,4 миллиарда строк за три месяца данных.

Как быстрее всего перевести эти строки из промежуточного этапа в итоговую таблицу? Задача потока данных SSIS (которая использует представление в качестве источника и имеет активную быструю загрузку) или команду Insert INTO SELECT ….? Я попробовал Data Flow Task и могу получить около 1 миллиарда строк примерно за 5 часов (8 ядер / 192 ГБ ОЗУ на сервере), что мне кажется очень медленным.

  • sql-server
  • sql-server-2012
  • производительность
  • вставка
  • запрос-производительность

6

Один общий подход:

  1. Отключение/удаление индексов/ограничений на целевой таблице.
  2. INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
  3. С учетом JNK, конечно, вы можете сделать вышеперечисленное в пакетах из n строк, что может уменьшить нагрузку на журнал транзакций и, конечно же, означает, что в случае сбоя какой-либо партии вам нужно будет начать только с этой партии. . Я написал об этом в блоге (в то время как в отношении удалений применяются те же основные концепции) здесь: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes
  4. Повторно включить/пересоздать индексы/ограничения для целевой таблицы (и, возможно, вы можете отложить некоторые из них, если они не нужны для всех операций, и важнее быстро получить базовые данные в сети).

Если ваши разделы являются физическими, а не только логическими, вы можете выиграть некоторое время, если разные процессы одновременно заполняют разные разделы (конечно, это означает, что вы не можете использовать TABLOCK / TABLOCKX ). Это предполагает, что источник также подходит для выбора нескольких процессов без перекрытия/блокировки и т. д., что делает эту сторону операции еще медленнее (подсказка: создайте кластеризованный индекс в источнике, который соответствует схеме секционирования в месте назначения).

Вы также можете рассмотреть что-то более примитивное, например BCP OUT / BCP IN .

Не знаю, стал бы я обращаться к службам SSIS, чтобы помочь с этим. Вероятно, в этом есть некоторая эффективность, но я не уверен, что усилия оправдывают экономию.

1

Глядя на вашу проблему с точки зрения SSIS, я чувствую, что причина, по которой это могло занять так много времени, заключается в том, что у вас не было пакетной обработки.