Я сравниваю производительность вставки SQL Server 2017 для таблицы с некластеризованным первичным ключом (GUID) и дополнительным кластеризованным индексом (int). Несмотря на то, что я ожидал некоторого снижения производительности по сравнению с PK для автоинкрементных целочисленных значений, полученные показатели не кажутся разумными - вставка в таблицу с GUID PK занимает буквально в 70 раз больше времени.
Таблица:
[Table1]
(
[Id] [INT] IDENTITY(1,1) NOT NULL, <-- clustered PK
[Prop_s1] [NVARCHAR](MAX) NULL,
[Prop_s2] [NVARCHAR](MAX) NULL,
...
[Prop_b3] [BIT] NULL,
[Prop_n3] [DECIMAL](18, 2) NULL
)
[Table2]
(
[Id] [UNIQUEIDENTIFIER] NOT NULL, <-- non-clustered PK
[Prop_s1] [NVARCHAR](MAX) NULL,
[Prop_s2] [NVARCHAR](MAX) NULL,
...
[Prop_b3] [BIT] NULL,
[Prop_n3] [DECIMAL](18, 2) NULL,
[ClusterId] [INT] IDENTITY(1,1) NOT NULL, <-- clustered
)
Запросы выглядят как
Insert into Table (....)
select ....
union all
select ....
Идентификаторы для Table2 генерируются на стороне клиента.
Обе таблицы идентичны по структуре.
Я могу вставить 10 тыс. Записей за 550-600 мс с автоинкрементом int PK.
С помощью направляющих клавиш это занимает около 35 секунд на 10 тыс. Строк.