мы написали простой код для генерации 750 классов с именами от MyObj0 до MyObj749, каждый класс имеет 1 int (ID) и 10 строковых свойств, без свойств навигации и внешних ключей для начала.
Причина, по которой мы это делаем, заключается в том, что мы хотели бы использовать EF, но наши производственные базы данных содержат приблизительно 700 - 800 таблиц.
Это образец первого класса.
public class MyObj0
{
public int MyObj0ID { get; set; }
public string Name0 { get; set; }
public string Name1 { get; set; }
public string Name2 { get; set; }
public string Name3 { get; set; }
public string Name4 { get; set; }
public string Name5 { get; set; }
public string Name6 { get; set; }
public string Name7 { get; set; }
public string Name8 { get; set; }
public string Name9 { get; set; }
}
Класс DbContext
class Db : DbContext
{
public DbSet<MyObj0> MyObj0s { get; set;}
public DbSet<MyObj1> MyObj1s { get; set;}
...
public DbSet<MyObj749> MyObj749s { get; set;}
}
Затем идет тестирование.
Database.SetInitializer<Db>(null); //comment this line to create the DB
Stopwatch stopw = new Stopwatch();
stopw.Start();
Db db = new Db();
db.Configuration.AutoDetectChangesEnabled = false;
Console.WriteLine("Db init: " + stopw.Elapsed.TotalMilliseconds.ToString());
stopw.Restart();
db.MyObj0s.Add(new MyObj0() { Name0 = "name" });
Console.WriteLine("Row insertion: " + stopw.Elapsed.TotalMilliseconds.ToString());
stopw.Restart();
db.SaveChanges();
Console.WriteLine("Save changes: " + stopw.Elapsed.TotalMilliseconds.ToString());
Console.ReadLine();
return;
И результат?
Db init: 616,3831
(which is ok if we consider that this happens only
when the application starts)
Row insertion: 7663,673
(7 seconds to insert a row. Not ok at all.)
Save changes: 3647,1969
(3 seconds to insert a row into the database. Not ok at all)
Есть ли какие-то проблемы с производительностью для EF, с которыми мы еще не сталкивались?Или EF на данном этапе не подходит для больших баз данных?(Мы использовали его для множества небольших проектов, и там он работает довольно гладко)
РЕДАКТИРОВАТЬ
По вопросу Ладислава:
Попытка вставить другойряд после первого ряда намного быстрее.0,0562 миллисекунды.К сожалению, операция SaveChanges все еще занимает ок.3500 мс
После еще одного наблюдения я обнаружил, что при вставке первой строки приложение потребляет много памяти, от нескольких мегабайт до примерно 65 мегабайт, и после вызова SaveChanges оно скачет еще на 10 Мб.Поэтому мне кажется, что есть некоторые процедуры инициализации для операций с первой строкой, о которых я еще не узнал.
Тем не менее, зная об этом, я мог бы легко избежать задержки для первой операции, если бы вставил некоторые фиктивные данныекогда приложение запустится.(Время запуска приложения не имеет значения, поскольку оно будет использоваться в веб-проекте, и все, даже клиенты, ожидают некоторого лага во время развертывания)
Может ли кто-нибудь объяснить поведение, стоящее за этим?Я искренне думаю, что мы только что пропустили что-то важное ...
РЕДАКТИРОВАТЬ 2
После очередной игры я обнаружил, что вызов другого SaveChanges () почти ничего не требуета также 0,05 мсТаким образом, мы можем с радостью вставить пустую строку, а затем вызвать SaveChanges (), и все должно работать нормально.Но этот подход просто ... не хорошо.Я забыл какую-то инициализацию?Потому что я понятия не имею, что еще важно помимо функции SetInitializer ...