SSIS для вставки из таблицы в таблицу и (только для SQL) INSERT INTO () SELECT FROM - PullRequest
4 голосов
/ 05 октября 2011

В настоящее время я переношу большое количество записей из одной таблицы в другую, и в процессе их обработки. Итак, у меня есть SQL в этом общем формате:

INSERT INTO TargetTable
   (Col1,
   Col2,
   ...
   ColX)
   Tot
   )
SELECT
   Col1,
   Col2,
   ...
   ColX
   SUM(TOT)
FROM 
   SourceTable
GROUP BY
   Col1,
   Col2,
   ...
   ColX

Есть ли какое-либо преимущество в производительности при перемещении этого SQL в задачу SSIS при переносе записей из одной таблицы в другую с использованием SQL SELECT в качестве источника? Например, отключено ли ведение журнала?

Вторичный вопрос: есть ли какая-нибудь тактика, которую я мог бы использовать для обеспечения максимальной скорости передачи? Например, удаление индексов из целевой таблицы перед вставкой, блокировка таблицы и т. Д.

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

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

В качестве альтернативы, если вы придерживаетесь инструкции SQL, раздел этой статьи озаглавленный Использование INSERT INTO… SELECT для группового импорта данных с минимальным ведением журнала предоставляет следующие рекомендации:

Вы можете использовать INSERT INTO SELECT FROM для эффективной передачи большого количества строк изодна таблица, такая как промежуточная таблица, на другую таблицу с минимальным ведением журнала.Минимальное ведение журнала может повысить производительность оператора и снизить вероятность заполнения операции доступным пространством журнала транзакций во время транзакции.

Минимальное ведение журнала для этого оператора имеет следующие требования:

  • Для модели восстановления базы данных задано простое или массовое ведение журнала.
  • Таблица назначения представляет собой пустую или непустую кучу.
  • Таблица назначения не используется в репликации.
  • Подсказка TABLOCK указана для целевой таблицы.

Мне лично не нравятся пакеты служб SSIS по определенной причине: у меня никогда не было администратора баз данных, который был бы посвящен их обслуживанию.Проекты импорта данных, над которыми я работал, требовали много хлопот, поскольку исходные данные не были чистыми (что, я полагаю, не будет для вас проблемой), поэтому у меня было много пакетов, которые работали очень хорошо в тестовой среде сограниченная выборка данных, которая сразу же вылетала при развертывании в производство, что делало процесс болезненным для шеи.

Это только мое мнение, но я бы сказал, что если вы или кто-то еще, с кем вы работаете, фокусируетсяв пакетах служб SSIS в рамках обслуживания базы данных легче поддерживать и документировать процесс, который находится внутри хранимой процедуры.

2 голосов
/ 05 октября 2011

Установите запись как простую.Установите размер бревна достаточно большим, чтобы обрабатывать вставку.Есть другие в системах?Помочь будет вкладка - TargetTable with (tablock).Если у вас есть кластеризованный индекс в TargetTable, упорядочите данные таким образом в select.Если вы можете принять грязное чтение SourceTable с (nolock).Если вы вставляете более 100 000 записей, возможно, вы захотите разбить вставку с помощью оператора where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...