实体框架上看似简单的查询非常慢

时间:2012-12-03 14:32:34

标签: c# sql performance entity-framework

所以我的项目中有一个非常基本的数据模型(针对.NET 4.0,使用NuGet安装的EF 5,数据库优先),有2个表,Item和ItemGroup。

Item-table有各种字段,包括字符串和数字,以及指向ItemGroup的外键。

另一方面,ItemGroup只有Id,Name和Code(最后2个是字符串)。

现在,我有大约50k个项目,只有100个ItemGroups。如果我使用SQL事件探查器执行context.Items.ToList(),则持续时间约为2-3秒,这是完全可以接受的。但是,如果我想使用context.Items.Include("ItemGroup").ToList()同时加载ItemGroups,则执行时间会上升到大约12秒。此外,如果我在获取所有Items之后只获取所有ItemGroup,则执行时间也很长。这让我相信这是项目与各自的团队的映射,花费时间。

但是,这仍然无法解释为什么SQL Profiler报告非常简单的INNER JOIN -query也会超过10秒,相比之下,没有JOIN的同一查询会花费2-3秒。

我在这里不知所措,以前从未遇到过这样的问题,所以任何建议都非常受欢迎。

1 个答案:

答案 0 :(得分:5)

当您使用预先加载(包含)时,它会立即从数据库加载整个数据库树。因此它非常慢。

但是,您可以使用LinqPad然后使用数据库引擎优化顾问,通过将您的EF查询转换为T-SQL 来确定需要改进的领域 on Sql Server 2008 将帮助您确定索引键所需的内容。

我写过关于如何将EF转换为T-Sql Here

的博文

本文将解释 10种提高EF查询效果的方法 Here