У меня есть база данных, в которую я загружаю файлы в промежуточную таблицу, из этой промежуточной таблицы у меня есть 1-2 соединения, чтобы разрешить некоторые внешние ключи, а затем вставить эти строки в итоговую таблицу (которая имеет один раздел в месяц). У меня есть около 3,4 миллиарда строк за три месяца данных.
Какой самый быстрый способ получить эти строки из финальной таблицы? Задача потока данных служб SSIS (которая использует представление в качестве источника и активна быстрая загрузка) или команда Вставить INTO SELECT ....? Я попробовал Задачу потока данных и смог получить около 1 миллиарда строк примерно за 5 часов (8 ядер / 192 ГБ ОЗУ на сервере), что мне кажется очень медленным.
Ответы:
Один общий подход:
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
n
строк, что может снизить нагрузку на журнал транзакций и, конечно же, означает, что в случае сбоя какого-либо пакета вам потребуется только запустить этот пакет. Я писал об этом в блоге (хотя в отношении удалений применяются те же основные понятия) здесь: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletesЕсли ваши разделы являются физическими, а не просто логическими, вы можете выиграть некоторое время, если разные процессы будут заполнять разные разделы одновременно (конечно, это означает, что вы не можете использовать
TABLOCK
/TABLOCKX
). Это предполагает, что источник также подходит для нескольких процессов, выбирающих без перекрытия / блокировки и т. Д., И делает эту сторону операции еще более медленной (подсказка: создайте кластеризованный индекс на источнике, который соответствует схеме разделения на месте назначения).Вы также можете рассмотреть что-то более примитивное, например
BCP OUT
/BCP IN
.Я не знаю, что я прыгнул бы в SSIS, чтобы помочь с этим. Там, вероятно, есть некоторые преимущества, но я не знаю, что усилия оправдывают экономию.
источник
Глядя на вашу проблему с точки зрения SSIS, я чувствую, что это заняло так много времени, потому что у вас не было партии. Это может привести к слишком большому количеству строк, заполняющих конвейер служб SSIS, и в результате может снизить производительность SSIS. То, что вам нужно сделать, это изменить параметры строк в пакете и, возможно, максимальный размер вставки. Теперь, что вы также установите, будет зависеть от объема памяти, доступной вашему серверу SSIS? Какова скорость диска вашего экземпляра SQL Server? Лучший способ сделать это - проверить. Давайте, например, использовать 10 000. Это отправит пакет на сервер 10000 за раз, таким образом, предотвращая переполнение конвейера, и поможет ускорить этот процесс. Эти настройки установлены в вашем месте назначения OLEDB.
Если это проблема, вы также можете добавить задачу «Выполнить SQL» до и после выполнения, как это предлагает @AaronBertrand, и удалить / повторно добавить любые индексы или ограничения в таблицу.
источник