c# - 看似简单的查询在 Entity Framework 上非常慢

标签 c# sql performance entity-framework

因此,我的项目中有一个非常基本的数据模型(针对 .NET 4.0,使用 NuGet 安装的 EF 5,首先是数据库),其中包含 2 个表:Item 和 ItemGroup。

Item-table 具有各种字段(字符串和数字)以及指向 ItemGroup 的外键。

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

现在,我有大约 50k 个项目,但只有 100 个项目组。如果我使用 SQL Profiler 执行 context.Items.ToList(),持续时间约为 2-3 秒,这是完全可以接受的。但是,如果我想使用 context.Items.Include("ItemGroup").ToList() 同时加载 ItemGroup,则执行时间会跳至大约 12 秒。另外,如果我在获取所有项目后简单地获取所有项目组,执行时间也会很长。这让我相信,将项目映射到各自的组需要花费时间。

但是,这仍然无法解释为什么 SQL Profiler 报告非常简单的 INNER JOIN 查询也花费了 10 多秒,而没有 JOIN 的相同查询只花费了区区 2-3 秒。

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

最佳答案

当您使用急切加载(包括)时,它会立即从数据库加载整个数据库树。所以速度非常慢。

但是您可以通过使用 LinqPad 将 EF 查询转换为 T-SQL 来确定需要改进的区域。然后通过使用Sql Server 2008上的Database Engine Tuning Adviser将帮助您确定所需的索引键

微软还 published an article on EF performance considerations您可能想阅读。

关于c# - 看似简单的查询在 Entity Framework 上非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685367/

相关文章:

c# - 为什么我下载文件的代码会生成损坏的 PDF?

mysql - 从表中删除多行 (SQL)

mysql - 从每小时总和中获取最大用户分数

performance - Jmeter - 带有计数器配置元素的 While Controller

mysql - 最大化 SQL SELECT 语句的效率

iOS 模拟器 CPU 负载

c# - 如何在不将属性名称作为字符串传递的情况下引发 PropertyChanged 事件?

c# - 单一职责和依赖

c# - 为单个程序集禁用 Resharper 智能感知

sql - 将计算列设置为非 Null 时遇到问题