Массовое копирование вставок с DBCC CheckIdent

Нашей команде нужно вставить огромное количество данных в нашу базу данных SQL Server 2008. Мы ищем хорошее решение. Теперь мы придумали один, но я сомневаюсь в нем, просто потому, что он кажется неправильным. Поэтому я спрашиваю здесь, кажется ли это хорошим решением. Дополнительным вызовом является то, что это одноранговая реплицированная база данных на 4 серверах! :)

Представьте, что у нас есть 1 миллион строк для вставки.

  1. Начать транзакцию
  2. Увеличьте текущее значение идентификатора в таблице с 1 миллионом
  3. Подготовьте DataSet/DataTable с 1 миллионом строк и правильными идентификаторами.
  4. Массовое копирование данных в базу данных
  5. Зафиксировать транзакцию

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


person Dennis van der Stelt    schedule 22.04.2010    source источник


Ответы (1)


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

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

Если это разовое дело, то может получиться. Если вы планируете делать это регулярно, я бы рассмотрел систему миграции более высокого уровня, в которой вы переносите данные в новые значения идентификаторов или используете guid с NEWSEQUENTIALID(), чтобы вы получали правильные проверенные индексы, а также уникальные передаваемые идентификаторы. .

person Frans Bouma    schedule 22.04.2010