Самый эффективный способ сохранить «набор» в SQL Server 2008? - PullRequest
1 голос
/ 06 января 2011

У меня около 2 миллионов строк данных, каждая строка с искусственным PK и два поля Id (так: PK, ID1, ID2). У меня есть уникальное ограничение (и индекс) для ID1 + ID2.

Я получаю два вида обновлений, каждый с отдельным ID1 для каждого обновления.

  1. 100-1000 строк абсолютно новых данных (ID1 новый)
  2. 100-1000 строк в значительной степени, но не обязательно полностью перекрывающихся данных (ID1 уже существует, возможно, новые пары ID1 + ID2)

Какой самый эффективный способ сохранить этот «набор»? Вот варианты, как я их вижу:

  1. Удалить все строки с ID1, вставить все новые строки (yikes)
  2. Запросить все существующие строки из набора новых данных ID1 + ID2, вставить только новые строки
  3. Вставить все новые строки, игнорировать вставки, которые вызывают уникальные нарушения ограничений

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Если вы используете SQL Server 2008 (или 2008 R2), вы можете посмотреть на MERGE , что-то вроде:

MERGE INTO MyTable mt 
USING NewRows nr 
   ON mt.ID1 = nr.ID1 and mt.ID2 = nr.ID2
WHEN NOT MATCHED THEN 
   INSERT (ID1,ID2,<more columns>) VALUES (nr.ID1,nr.ID2,<other columns>);
1 голос
/ 06 января 2011

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

  1. Вы можете потерять данные, которые выхотите или должны сохранить.
  2. Исходя из схемы таблицы, которую вы упомянули, это должно быть разумно.
  3. Это будет работать, только если вы выполняете каждую INSERT отдельно.

Я бы предложил [2] на основе доступной информации.

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