【发布时间】:2025-11-27 14:45:02
【问题描述】:
我看到一些非常奇怪的性能与使用 .NET 框架版本 4 的 Entity Framework Code-First 的非常简单的查询相关。LINQ2Entities 查询如下所示:
context.MyTables.Where(m => m.SomeStringProp == stringVar);
这需要 3000 多毫秒才能执行。生成的 SQL 看起来很简单:
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'
此查询在通过 Management Studio 运行时几乎立即运行。当我更改 C# 代码以使用 SqlQuery 函数时,它会在 5-10 毫秒内运行:
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);
因此,完全相同的 SQL,生成的实体在两种情况下都被更改跟踪,但两者之间的性能差异很大。什么给了?
【问题讨论】:
-
我预计您会看到初始化延迟 - 可能是查看编译。请参阅 MSDN:
Performance Considerations for Entity Framework 5 -
我尝试过预生成视图,但似乎没有帮助。此外,在慢速查询之前运行另一个 EF 查询以排除初始化内容。新查询运行得很快,慢的查询仍然运行得很慢,即使在第一次查询期间发生了上下文预热。
-
@marc_s - 不,SqlQuery 将返回一个完全物化并跟踪更改的实体实例。见msdn.microsoft.com/en-us/library/…
-
为您的 EF 查询生成的 SQL 实际上是内联参数值,还是使用参数?这不应该影响单个查询的查询速度,但可能会随着时间的推移导致服务器中的查询计划膨胀。
-
您是否尝试过两次/多次运行相同的查询?第二次运行需要多长时间?您是否在 .NET Framework 4.5 上尝试过 - .NET Framework 4.5 中有一些与 EF 相关的性能改进可能会有所帮助。
标签: performance entity-framework ef-code-first