2016-04-02 2 views
2

Im тестирование с использованием Entity Framework с Azure Sql db. При вставке 1 записи действие занимает 400 мс. При добавлении 20 это 2500 мс.Производительность вложения Entity Framework

400 мс для вставки 1 записи через EF, похоже, много.

Какова нормальная скорость работы EF?

Я что-то не так?

Im известно, что объемная вставка может быть улучшена, но я думал, что одна вставка может быть выполнена намного быстрее !?

var start = DateTime.Now; 
testdbEntities testdbEntities = new testdbEntities(); 

for (int i = 0; i < 20; i++) 
    testdbEntities.Users.Add(new User{Name = "New user"}); 

testdbEntities.SaveChanges(); 

var end = DateTime.Now; 
var timeElapsed = (end - start).TotalMilliseconds; 
+0

У вас есть индексы на таблицах? Как скорость вашего интернет-соединения? Является ли вставка, когда вы локальны или когда она находится на производстве на сервере Azure? – krillgar

+0

Это совершенно новый db и стол. У меня 50-мегабайтная загрузка. Вставка почти такая же локальная, как и в производстве на Azure. – redlaz

+0

У вас может быть 50-минутная загрузка - но что такое LATENCY? Если вы находитесь на расстоянии 100 мс от своей лазурной базы данных, это не совсем неуместно. – TomTom

ответ

2

Все общие трюки, как:

  • AutoDetectChangesEnabled = ложь
  • Использование AddRange над Добавить
  • Etc.

Будет не работать, как вы уже заметили, так как проблема производительности не в Entity Framework, но с SQL Azure

SQL Azure может выглядеть довольно прохладно на первый, но это медленно, как ад, если вы заплатил за очень хороший уровень базы данных Premium.

Как рекомендуется Evk, попробуйте выполнить простую командную строку SQL, например «SELECT 1», и вы заметите, что это, вероятно, занимает более 100 мс, что является смехотворно медленным.

Решение:

  • Перейти к лучшему SQL Azure Tier
  • Move от SQL Azure

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

Другим решением является использование этой библиотеки, которая будет выполнять несколько запросов/массовых операций. Однако, даже если эта библиотека очень быстрая, вам понадобится лучший SQL Azure Tier, так как каждый раз, когда вы просматриваете каждую базу данных, вы получаете более 200 мс в вашем случае.

+0

отключение никогда не будет хорошим решением, если проблема не является общей. – TheGameiswar

+0

Спасибо. Это имеет смысл. – redlaz

+0

Кто-нибудь заметил улучшение производительности совсем недавно? Я использую E.F. для вставки в Azure SQL и совсем недавно заметил значительное улучшение производительности без меня что-то меняя. – donquijote

0

Вы можете отключить автоматическое обнаружение изменений во время ввода. Это может действительно повысить производительность. https://msdn.microsoft.com/en-us/data/jj556205.aspx

Я надеюсь, что это помогает :)

+0

Я пробовал это. Никаких серьезных улучшений для одиночных вставок – redlaz

1

Каждая вставка приводит к фиксации и причины войти затвердевают (утопленный на диск). В случае записи партиями это может не привести к одному сливу на каждую вставку (до тех пор, пока не будут заполнены буферы журналов). Поэтому попробуйте как-то выполнить партию результатов, например, используя TVF

0

Большинство приложений EF используют постоянные неосведомленные объекты POCO и отслеживание изменений моментальных снимков. Это означает, что в самих сущностях нет кода для отслеживания изменений или уведомления контекста изменений.

При использовании большинства объектов POCO определение того, как сущность изменилось (и, следовательно, какие обновления необходимо отправить в базу данных), обрабатывается алгоритмом обнаружения изменений. Обнаружение изменений работает, обнаруживая различия между текущими значениями свойств объекта и исходными значениями свойств, которые хранятся в моментальном снимке, когда объект был запрошен или присоединен.

Обнаружение изменения моментального снимка принимает копию каждого объекта в системе, когда они добавляются в диаграмму отслеживания структуры Entity Framework. Затем, когда сущности изменяют каждую сущность, ее сравнивают с ее снимком, чтобы увидеть какие-либо изменения. Это происходит путем вызова метода DetectChanges. Важно знать об DetectChanges, так это то, что он должен проходить через все ваши отслеживаемые объекты каждый раз при его вызове, поэтому чем больше вещей у вас в вашем контексте, тем больше времени требуется для прохождения.

Что такое автоматическое обнаружение изменений, является подключением к событиям, которые происходят в контексте, и вызывает обнаружение изменений по мере их возникновения.

Всякий раз, когда вы добавляете новый объект User, EF внутренне отслеживает его &, сохраняя текущее состояние вновь добавленного объекта в его снимке. Для операций массовой вставки EF сначала вставляет все записи в DB &, а затем вызывает функцию DetectChanges. Таким образом, время выполнения, необходимое для массовой вставки, - это время, необходимое для вставки всех записей + времени, необходимого для обновления контекста EF.

Вы можете сделать свою установку DB относительно быстрее, отключив AutoDetectChanges. Так что ваш код будет выглядеть,

using (var context = new YourContext()) 
{ 
    try 
    { 
     context.Configuration.AutoDetectChangesEnabled = false; 

     // do your DB operations 
    } 
    finally 
    { 
     context.Configuration.AutoDetectChangesEnabled = true; 
    } 
} 
Смежные вопросы