Предполагая, что на col1 / col2 есть индекс, это может работать лучше, чем попытка отсеять дубликаты в процессе вставки:
DELETE t
FROM #temp AS t
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.table
WHERE col1 = t.col1
AND col2 = t.col2
);
Эквивалентом подхода Джека будет:
INSERT dbo.table(col1, col2)
SELECT col1, col2
FROM #temp AS t
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.table
WHERE col1 = t.col1
AND col2 = t.col2
);
Я предполагаю, что у вас есть уникальный индекс в таблице #temp, поэтому вам не нужны DISTINCT
или GROUP BY
. Вы также можете сначала удалить дубликаты из таблицы #temp как отдельный шаг, например,
;WITH t AS
(
SELECT col1, col2,
rn = ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1)
)
DELETE t WHERE rn > 1;
Делаете ли вы правильные вещи или нет, не знаю. Потребуется намного больше информации и тестирования, чтобы определить, какой подход лучше. Вам придется сканировать более 2 миллионов строк на наличие дубликатов, независимо от того, какой метод вы в итоге используете.