Если вы не используете базу данных tempdb, убедитесь, что модель восстановления базы данных, в которой вы работаете, не установлена на «Full». Это приведет к большим накладным расходам на этих вставках строк 50M.
В идеале вы должны использовать промежуточную базу данных, простую модель восстановления, если это возможно, на RAID 10 и заранее масштабировать ее, чтобы обеспечить достаточно места для всех ваших операций. Выключи авто-рост.
Используйте INSERT ... WITH (TABLOCK), чтобы избежать ведения журнала на уровне строк:
INSERT INTO StagingTable WITH (TABLOCK) (.....)
SELECT .....
Аналогично для BULK INSERT. Если вы перетащите и создадите заново, создайте кластерный индекс до для вставки. Если вы не можете, вставьте сначала в одну таблицу, затем вставьте из нее в другую таблицу с правильной кластеризацией и обрежьте первую таблицу. Избегайте небольших размеров партии на BULK INSERT, если это возможно. Внимательно прочитайте документацию BULK INSERT, так как вы можете саботировать производительность неправильными опциями.
Избегайте вставки ... EXEC. Каждый ряд регистрируется.
Избегайте ОБНОВЛЕНИЙ, если только вам не нужно вычислять промежуточные итоги. Как правило, дешевле вставить из одной таблицы в другую, а затем обрезать первую таблицу, чем обновить на месте. Промежуточные вычисления являются исключением, поскольку они могут быть выполнены с помощью UPDATE и переменных для накопления значений между строками.
Избегайте табличных переменных ни для чего, кроме управляющих структур, поскольку они предотвращают распараллеливание. Не присоединяйте свою таблицу строк 50M к переменной таблицы, вместо этого используйте временную таблицу.
Не бойтесь курсоров для итерации. Используйте переменные курсора и объявите их с ключевым словом STATIC для столбцов с низким количеством элементов в начале кластеризованного индекса. Используйте это, чтобы нарезать большие таблицы на более управляемые куски.
Не пытайтесь делать слишком много в одном утверждении.