2011-01-06 2 views
1

У меня есть ~ 2 миллиона строк или около того данных, каждая строка с искусственным PK и два поля Id (так: PK, ID1, ID2). У меня есть уникальное ограничение (и индекс) на ID1 + ID2.Самый эффективный способ поддержки «набора» в SQL Server 2008?

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

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

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

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

Любые мысли?

+0

какая версия SQL Server? –

ответ

1

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

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

Предлагаю [2] на основе имеющейся информации.

+0

Да, есть компромиссы, конечно - в принципе все они приемлемы, я просто пытаюсь свести к минимуму мою боль: затраты на эту работу немного. Благодаря! –

3

Если вы используете 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>); 
+0

Удивительно, если я пойду с хранимой процедурой, я это рассмотрю. –

+1

Вам не нужна сохраненная процедура для использования этого кода. – HLGEM

Смежные вопросы