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 表达式节点类型“Invoke”
LINQ to Entities 无法识别方法 IsNullOrWhiteSpace