实体框架和性能

时间:2009-03-22 18:28:07

标签: performance entity-framework

我正在尝试使用实体框架开发我的第一个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();

4 个答案:

答案 0 :(得分:1)

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

想象一下,您需要使用如下SQL语句更新表中的行:

UPDATE table SET col1 = @a where col2 = @b

使用SQL这只是服务器的一次往返。使用实体框架,您(至少)有一个往返服务器的往返加载所有数据,然后您修改客户端上的行,然后它将逐行发回

如果你的网络连接有限,并且你只有几行,这会减慢速度。

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

答案 1 :(得分:0)

我一直在试验实体框架,我没有看到任何真正的性能问题。

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

此外,数据库结构的复杂性可能会使实体框架稍微减慢,但速度不会超出您所说的速度。数据库结构中是否存在一些“无限循环”?没有DB结构,很难说出错了。

答案 2 :(得分:0)

你可以在直接的SQL中尝试相同的吗?

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

我还看到插入数据库时​​出现问题,而这些数据库从未被备份过。事务日志无法回收并且疯狂增长,导致单个插入需要几秒钟。

直接在SQL中尝试这个可以告诉你问题确实是EF。

答案 3 :(得分:0)

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