Низкая производительность вставки данных Entity Framework для базы данных с 750 таблицами - PullRequest
1 голос
/ 29 февраля 2012

мы написали простой код для генерации 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 ...

...