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
Один общий подход:
- Отключение/удаление индексов/ограничений на целевой таблице.
-
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
- С учетом JNK, конечно, вы можете сделать вышеперечисленное в пакетах из
n
строк, что может уменьшить нагрузку на журнал транзакций и, конечно же, означает, что в случае сбоя какой-либо партии вам нужно будет начать только с этой партии. . Я написал об этом в блоге (в то время как в отношении удалений применяются те же основные концепции) здесь: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes - Повторно включить/пересоздать индексы/ограничения для целевой таблицы (и, возможно, вы можете отложить некоторые из них, если они не нужны для всех операций, и важнее быстро получить базовые данные в сети).
Если ваши разделы являются физическими, а не только логическими, вы можете выиграть некоторое время, если разные процессы одновременно заполняют разные разделы (конечно, это означает, что вы не можете использовать TABLOCK
/ TABLOCKX
). Это предполагает, что источник также подходит для выбора нескольких процессов без перекрытия/блокировки и т. д., что делает эту сторону операции еще медленнее (подсказка: создайте кластеризованный индекс в источнике, который соответствует схеме секционирования в месте назначения).
Вы также можете рассмотреть что-то более примитивное, например BCP OUT
/ BCP IN
.
Не знаю, стал бы я обращаться к службам SSIS, чтобы помочь с этим. Вероятно, в этом есть некоторая эффективность, но я не уверен, что усилия оправдывают экономию.
1
Глядя на вашу проблему с точки зрения SSIS, я чувствую, что причина, по которой это могло занять так много времени, заключается в том, что у вас не было пакетной обработки.