Как мне обрабатывать большие пакетные вставки SQL SERVER? - PullRequest
3 голосов
/ 08 октября 2008

Я хочу выполнить серию запросов в рамках проекта миграции. Сценарии, которые должны быть сгенерированы, создаются из инструмента, который анализирует устаревшую базу данных, а затем создает сценарий для сопоставления каждого из старых объектов с соответствующей новой записью. Сценарии хорошо работают для небольших объектов, но некоторые из них содержат записи в сотни тысяч, которые производят файлы сценариев размером около 80 МБ.

Каков наилучший способ запуска этих сценариев?

Есть ли какой-нибудь SQLCMD из приглашения, который имеет дело с большими сценариями?

Я также мог бы разбить сценарии на более мелкие сценарии, но я не хочу выполнять сотни сценариев для выполнения миграции.

Ответы [ 5 ]

2 голосов
/ 08 октября 2008

Если возможно, измените инструмент экспорта для экспорта файла, совместимого с BULK INSERT.

За исключением этого, вы можете написать программу, которая будет анализировать операторы вставки во что-то, что BULK INSERT примет.

1 голос
/ 08 октября 2008

BULK INSERT использует файлы формата BCP в традиционном (не XML) или XML. Нужно ли получать новую личность и использовать ее в детстве, и вы не можете сойти с рук с помощью SET IDENTITY INSERT ON, потому что дизайн базы данных сильно изменился? Если это так, я думаю, что вам может быть лучше использовать SSIS или аналогичную систему и выполнять объединение слиянием после назначения идентификаторов. Вы также можете загрузить данные в промежуточные таблицы в SQL, используя SSIS или BCP, а затем использовать обычный SQL (возможно, в SSIS в задаче SQL) с функцией OUTPUT INTO для сбора идентификаторов и использования их в дочерних элементах * 1010. *.

0 голосов
/ 08 октября 2008

Я искал "BULK INSERT" из опции файла, но не вижу никаких примеров формата файла. Может ли файл смешивать форматы строк или он всегда должен соответствовать CSV-моде? Причина, по которой я спрашиваю, состоит в том, что в разных родительских / дочерних таблицах используются идентификаторы, поэтому в настоящее время используются вставки для каждой строки.

0 голосов
/ 08 октября 2008

Просто выполните скрипт. Мы регулярно запускаем сценарии резервного копирования / восстановления размером 100 МБ. Это займет всего 30 секунд или около того.

Если критически важно не блокировать ваш сервер на это время, вам придется немного его разделить.

Также обратите внимание на параметр -tab mysqldump, который выводит данные с помощью TO OUTFILE, который более эффективен и быстрее загружается.

0 голосов
/ 08 октября 2008

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

Возможно, вам лучше использовать ETL (DTS, SSIS, BCP или BULK INSERT FROM или какой-либо другой инструмент) для переноса данных вместо сценариев каждой вставки.

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

...