2016-05-24 3 views
0

Одна из наших систем имеет таблицу, которая получает около 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 стоимость

Мне бы очень хотелось разобраться в этом, но сейчас я в тупике. Любой совет?

+0

Вы пробовали качать ClusteredIndex? –

+0

Это место, где почти все операции select в этой таблице возвращают данные в порядке даты. Кроме того, учитывая, что вставки указаны в порядке даты, кластерный индекс в этом столбце имел смысл в моих глазах, вместо того, чтобы использовать столбец PK (uniqueidentifier). – James

+0

Является ли медленная работающая вставка последовательной или вы получаете так много бега быстро, то один возраст? –

ответ

-1

Как вы заметили, SaveChange делает базу данных обратной связью для каждой записи. Поэтому, если вы добавляете 20 тыс. Записей в день, выполняется 20-кратная база данных.

Редактирование & Улучшенный индекс практически не будет отличаться, поскольку реальная проблема - это количество базы данных в оба конца!

Чтобы зафиксировать производительность, вы должны использовать библиотеку, которая позволяет выполнять Bulk Вставьте

Существует три майоров библиотеки, поддерживающие его:

Вы можете узнать больше о трех библиотеках здесь: Entity Framework Bulk Insert Library Reviews & Comparisons

Отказ от ответственности: Я владелец проекта Entity Framework Extensions

+0

Массовые вставки не являются проблемой, эти вставки 20k происходят в течение 24 часов. Сохранение их для объемной вставки не является вариантом. – James

Смежные вопросы