В одной из наших систем есть таблица, которая получает около 20 тысяч вставок в день — в настоящее время она содержит около 10 миллионов строк. Мы только что выпустили обновление системы, и теперь я получаю ужасно низкую производительность при вставках в эту таблицу (30-40-секундные трассировки). Вставки будут вставлять только одну строку за раз. Entity Framework генерирует следующий SQL:
declare @generated_keys table([ID] uniqueidentifier)
insert [dbo].[Table]([Col1], Col2], etc)
output inserted.[ID] into @generated_keys values (@0, @1, etc)
select t.[ID] from @generated_keys as g join [dbo].[Table] as t on g.[ID] = t.[ID] where @@ROWCOUNT > 0
Ничего необычного - по крайней мере, насколько я вижу.
В таблице 12 FK. Поскольку объект представляет событие, основанное на времени, кластеризованный индекс находится в столбце DateCreated
. Есть еще 8 некластеризованных индексов с различными включенными столбцами. Столбец ID
является ПК и имеет уникальный некластеризованный индекс.
В качестве примечания я заметил, что из-за упущения в столбце ID
используется newid()
вместо newsequentialid()
.
Фактический план выполнения состоит из следующих основных частей:
7x 3% — поиск кластеризованного индекса в FK-таблицах
1x 8% — вставка таблицы (@generated_keys)
1x 74% — вставка кластеризованного индекса, 1 фактическая строка, стоимость 0,09
Я действительно хотел бы добраться до сути этого, но я сейчас в тупике. Любой совет?