我遇到了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秒。
要调用procs
变量,EF调用大约需要12秒。
还有一些事情。
我没有在EF之后运行sql进行比较。我已经确定缓存中没有计划。事实上,我已经做到了。我在计划进入缓存时运行SQL,何时运行SQL。运行2件事的任何和所有组合都会产生相同的结果。原始SQL只是EF查询时间的一小部分。
我全都使用存储过程,其中查询非常复杂,并且性能需要自定义SQL。
但上面的查询很简单。生成的SQL很简单。
我宁愿不用数百万个存储过程来丢弃我的数据库,只是因为我无法弄清楚如何使EF执行。
有没有办法加快速度?
由于
答案 0 :(得分:1)
您可以使用this answer(来自this article)所述的AsNoTracking
:
Entity Framework提供了许多性能调优选项,可帮助您优化应用程序的性能。其中一个调整选项是
.AsNoTracking()
。此优化允许您告知实体框架不跟踪查询的结果。这意味着实体框架不会执行查询返回的实体的其他处理或存储。但是,这也意味着您无法在不将其重新连接到跟踪图的情况下更新这些实体。