Performance 实体框架和性能

Performance 实体框架和性能,performance,entity-framework,Performance,Entity Framework,我正在尝试使用实体框架开发我的第一个web项目,虽然我喜欢使用linq而不是编写sql的方式,但我确实存在一些严重的性能问题。我在一个表中有很多未处理的数据,我想对这些数据进行一些转换,然后插入到另一个表中。我遍历所有对象,然后将它们插入到新表中。我需要做一些小的比较(这就是为什么我需要将数据插入另一个表中),但是对于性能测试,我已经删除了它们。下面的代码(大约需要设置12-15个属性)花费了21秒,这是一段相当长的时间。它通常这么慢,我会做错什么 DataLayer.MotorExtracti

我正在尝试使用实体框架开发我的第一个web项目,虽然我喜欢使用linq而不是编写sql的方式,但我确实存在一些严重的性能问题。我在一个表中有很多未处理的数据,我想对这些数据进行一些转换,然后插入到另一个表中。我遍历所有对象,然后将它们插入到新表中。我需要做一些小的比较(这就是为什么我需要将数据插入另一个表中),但是对于性能测试,我已经删除了它们。下面的代码(大约需要设置12-15个属性)花费了21秒,这是一段相当长的时间。它通常这么慢,我会做错什么

DataLayer.MotorExtractionEntities mee = new DataLayer.MotorExtractionEntities();
List<DataLayer.CarsBulk> carsBulkAll = ((from c in mee.CarsBulk select c).Take(100)).ToList();

foreach (DataLayer.CarsBulk carBulk in carsBulkAll)
{
    DataLayer.Car car = new DataLayer.Car();
    car.URL = carBulk.URL;
    car.color = carBulk.SellerCity.ToString();
    car.year = //... more properties is set this way

    mee.AddToCar(car);
}
mee.SaveChanges();
DataLayer.MotorExtractionEntities mee=新的DataLayer.MotorExtractionEntities();
List carsBulkAll=(从mee.CarsBulk中的c选择c.Take(100)).ToList();
foreach(carsBulkAll中的DataLayer.CarsBulk carBulk)
{
DataLayer.Car Car=新的DataLayer.Car();
car.URL=carBulk.URL;
car.color=carBulk.SellerCity.ToString();
car.year=/…更多属性是这样设置的
mee.AddToCar(汽车);
}
mee.SaveChanges();

我已经对实体框架进行了很多实验,但没有发现任何真正的性能问题

您的代码中哪一行导致了较大的延迟,您是否尝试过调试它,并测量哪种方法花费的时间最多


此外,数据库结构的复杂性可能会降低实体框架的速度,但不会降低到您所说的速度。您的数据库结构中是否存在一些“无限循环”?如果没有DB结构,就很难说出什么问题。

您可以在直接SQL中尝试同样的方法吗

问题可能与数据库有关,而不是实体框架。例如,如果有大量索引和大量检查约束,则插入可能会变得很慢

我还看到insert中从未备份过的数据库出现问题。事务日志无法回收,并且正在疯狂增长,导致单次插入需要几秒钟的时间


直接在SQL中尝试这一点会告诉您问题是否确实与EF有关。

我想我解决了这个问题。我一直在本地运行该应用程序,而数据库位于另一个国家(邻国,但绝不会更少)。我尝试将应用程序加载到服务器并从那里运行,然后只花了2秒而不是20秒。我尝试传输了1000条记录,耗时26秒,这是一个相当大的更新,尽管我不知道这是否是将1000条记录保存到数据库的“常规”速度?

您无法使用Entity Framework创建批更新

假设您需要使用如下SQL语句更新表中的行:

UPDATE table SET col1 = @a where col2 = @b
使用SQL,这只是到服务器的一次往返。使用实体框架,您(至少)有一次到服务器的往返,加载所有数据,然后您修改客户机上的行,然后它将逐行发送回

这会减慢速度,尤其是当您的网络连接受到限制,并且您的行数超过几行时


因此,对于这种更新,存储过程的效率仍然要高得多。

对于错误的代码缩进,很抱歉……我已经尝试删除了mee.SaveChanges,现在它运行得非常快,那么提交数据时会出现什么问题呢?Wim,数据库结构非常简单,根本没有关系,而且里面只有大约15个字段,这就是为什么我认为它是wierd的原因它只需要10-20秒就可以保存100行的更改?自从你的帖子发布以来,我一直在这里用我们为客户端运行的数据库对它进行快速测试。这是一个相当复杂的数据库,创建100个包含各种关系的新行只需3秒钟。我必须说,我让数据库在本地运行,这样可以加快工作速度