实体框架 + LINQ 缓慢与字符串查询速度?

Posted

技术标签:

【中文标题】实体框架 + LINQ 缓慢与字符串查询速度?【英文标题】:Entity Framework + LINQ Slowness vs String Query Speed? 【发布时间】:2012-04-06 06:57:38 【问题描述】:

我继承了一个 C# / ASP.NET MVC / Entity Framework 项目,但速度有些慢。数据库中的数据不多,但对.Include() 的调用导致速度变慢。

但是,我发现了一些非常奇怪的东西。我有一个只有数字(5 列)的 2k 行表。我正在搜索的列上有索引。

做的时候:

_entities.MyTable.Where(x=> x.Id1 == 4 && x.Id2 == 5).First()

在我的开发机器上需要 1800 毫秒。

但是,当我这样做时:

_entities.MyTable.Where("it.Id1 = 4 and it.Id2 = 5").First()

大约需要 10 毫秒。

有什么关系?我不明白为什么 LINQ 表达式会这么慢。

【问题讨论】:

尝试在 LinqPad 中解压,并将其生成的 SQL 查询与您自己的进行比较 MyTable 是否在任何实体中继承? @daryal 抱歉,说到 EF,我还是个菜鸟,那会是什么样子?此对象/模型与其他对象相关。表中的数字是其他表的外键。 @AlexandruPetrescu,您在模型中是否有任何关系,例如指向 MyTable 的箭头? (这意味着 mytable 是关系另一端的基类) @daryal 此类有 3 个导航属性(外键),但我在 edmx 模型中看不到“箭头”。我看到了关系,但在进行 .Where(x=>) 调用时我没有调用 .Include() ,所以它不应该查询这些表吗? 【参考方案1】:

打开 Sql Profiler,查看来自 EF 的查询。尝试分析它,制定计划。似乎 EF 以一种奇怪的方式实现查询,没有获取索引。

【讨论】:

我的开发盒上没有分析器,因为我正在运行 SQL Express。还有其他方法吗?我让 SQL Server Management Studio 运行/调试查询。 不确定这里是否允许在其他资源上发布链接,但谷歌“sql server 获取所有查询”。有很多方法可以在没有分析器的情况下运行查询 我根据上面的建议使用 LinqPad,它和 String 方法一样快,但是参数的顺序很奇怪......它在做“where (4 = Id1) and (5 = Id2)" 而不是 Id1=4 和 Id2=5。尽管在 LinqPad 中,它似乎对性能影响不大。【参考方案2】:

是不是 EF 必须生成 SQL 才能在第一个示例中执行 where 子句,而在第二个示例中,SQL 更容易生成,因为它可以插入您已经提供的 SQL?

我发现 EF 生成查询的速度非常慢,在这种情况下似乎不太可能,因为它在两种情况下都是相当简单的查询。

您是否尝试过编译第一个查询并多次运行以检查执行时间是否仅包括实际运行 SQL 而不仅仅是生成它?

【讨论】:

以上是关于实体框架 + LINQ 缓慢与字符串查询速度?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 linq 查询 Include() 多个子实体

实体框架 Linq 查询:.Where 链 vs &&

在LINQ中将字符串转换为Int…到实体框架[重复]

实体框架 - 分层设计 - 将连接字符串放在哪里?

实体框架 linq 主细节投影到自定义类

使用 .NET Core 进行分组的 Linq 查询