LINQ to Entities Perf优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ to Entities Perf优化相关的知识,希望对你有一定的参考价值。

我遇到了EF的一些性能问题,并且想知道......好吧......为什么。

我正在运行的查询只是:

var procs = ctx.Procedures
    .Include(p => p.ProcedureProcedureFields.Select(ppf => ppf.ProcedureField))
    .Where(p => p.IsActive)
    .Where(p => !p.ProcedureLogbookTypes1.Any()).ToList();

所以,甚至没有传递任何参数,这排除了问题。如果我从SQL事件探查器中获取SQL并直接在SSMS中运行它,则需要不到1秒。

EF调用大约需要12秒才能填充procs变量。

还有一些事情。

我没有在EF之后运行sql进行比较。我已经确定缓存中没有计划。事实上,我已经做到了。我计划在缓存中时运行SQL,何时不运行SQL。运行2件事的任何和所有组合都会产生相同的结果。原始SQL只是EF查询时间的一小部分。

我全都使用存储过程,其中查询非常复杂,并且性能需要自定义SQL。

但上面的查询很简单。生成的SQL很简单。

我宁愿不用一百万个小存储过程来丢弃我的数据库,只是因为我无法弄清楚如何使EF执行。

有没有办法加快速度?

谢谢

答案

您可以使用AsNoTracking(来自this answer)描述的this article

实体框架提供了许多性能调优选项,可帮助您优化应用程序的性能。其中一个调整选项是.AsNoTracking()。此优化允许您告知实体框架不跟踪查询的结果。这意味着实体框架不会执行查询返回的实体的其他处理或存储。但是,这也意味着如果不将这些实体重新连接到跟踪图,则无法更新这些实体。

以上是关于LINQ to Entities Perf优化的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 查询注意事项

LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

LINQ to Entities 无法识别方法 IsNullOrWhiteSpace

使用 LINQ-to-Entities 搜索时忽略空字符串

LINQ to Entities 和 String.StartsWith 的问题

LINQ to Entities OrderBy 表达式树