вам нужно определить ваш первичный ключ, чтобы игнорировать дубликаты:
CREATE TABLE [dbo].[t2](
[n] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[n] ASC
)WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Использование этой опции может снизить производительность:
Если в ваших данных небольшой процент дубликатов, IGNORE_DUP_KEY может ускорить вставку. Для больших количеств дубликатов IGNORE_DUP_KEY может значительно замедлить их. Я установил две таблицы, вычеркнув все несущественные детали, следующим образом:
CREATE TABLE t1(n INT NOT NULL PRIMARY KEY)
GO
CREATE TABLE [dbo].[t2](
[n] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[n] ASC
)WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Если во входных данных не было дубликатов, производительность обеих вставок была одинаковой:
INSERT t1(n)
SELECT n FROM dbo.Numbers
INSERT t2(n)
SELECT n FROM dbo.Numbers
(Обратите внимание, что dbo. Numbers содержит 1 миллион строк.) Конечно, я всегда усекал обе таблицы между своими тестами.
Если входящие данные содержали 1% дубликатов, вставка с IGNORE_DUP_KEY последовательно выполнялась примерно на 5% быстрее:
INSERT t1(n)
SELECT DISTINCT n FROM(
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers WHERE n <10000
) AS t
INSERT t2(n)
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers WHERE n <10000
С другой стороны, если входящие данные имели 100% дубликатов, вставка с IGNORE_DUP_KEY последовательно выполнялась как минимум на 300% медленнее, как для большого набора из 2 миллионов строк:
INSERT t1(n)
SELECT DISTINCT n FROM(
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers
) AS t
INSERT t2(n)
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers
Как и для меньшего набора строк по 200К:
INSERT t1(n)
SELECT DISTINCT n FROM(
SELECT n FROM dbo.Numbers WHERE n<100000
UNION ALL
SELECT n FROM dbo.Numbers WHERE n<100000
) AS t
INSERT t2(n)
SELECT n FROM dbo.Numbers WHERE n<100000
UNION ALL
SELECT n FROM dbo.Numbers WHERE n<100000
В целом, я решил не использовать IGNORE_DUP_KEY в моем конкретном случае. Я решил, что небольшая экономия при небольшом количестве дубликатов не оправдывает риск значительного падения производительности при больших объемах дублирующихся данных.