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

bob*_*lez 2 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.如果我context.Items.ToList()使用SQL事件探查器执行a ,持续时间大约为2-3秒,这是完全可以接受的.但是,如果我想使用同时加载ItemGroups context.Items.Include("ItemGroup").ToList(),则执行时间会跳到大约12秒.此外,如果我在获取所有Items之后只获取所有ItemGroup,则执行时间也很长.这让我相信这是物品到各自的团队的映射,花费时间.

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

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

Sam*_*ath 5

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

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

我写博客文章关于如何EF转换为T-SQL 这里

本文将介绍10多个方法来改善你的EF查询的性能 在这里

  • 实际上简单地在我的查询中添加AsNoTracking()解决了我的问题.如果我想提交对现有实体的更改,这显然需要手动附加,但对于我的用例,这很有效.解决方案可以在你链接的msdn文章中找到,我会接受你的回答,谢谢. (2认同)