Одна из наших систем имеет таблицу, которая получает около 20 тыс. Вставок в день - в настоящее время она содержит ~ 10 м строк. Мы просто вытолкнули обновление системы, и теперь я получаю несколько потрясающе медленную производительность при вставках в эту таблицу (трассы 30-40 с). Вставки будут вставлять только одну строку за раз. Entity Framework генерирует следующий SQL:Очень медленная производительность вставки на большой таблице (EF)
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% - кластерного индекса Seek на столах FK
1x 8% - Таблица Вставка (@generated_keys)
1x 74% - Clustered Index Insert, 1 фактический ряд, 0.09 стоимость
Мне бы очень хотелось разобраться в этом, но сейчас я в тупике. Любой совет?
Вы пробовали качать ClusteredIndex? –
Это место, где почти все операции select в этой таблице возвращают данные в порядке даты. Кроме того, учитывая, что вставки указаны в порядке даты, кластерный индекс в этом столбце имел смысл в моих глазах, вместо того, чтобы использовать столбец PK (uniqueidentifier). – James
Является ли медленная работающая вставка последовательной или вы получаете так много бега быстро, то один возраст? –