相关话题:Entity framework performance tuning
Entity Framework Core总是生成性能最好的查询吗?是否有一个Counter-Example (EF查询的性能低于原始SQL查询(EF生成一个SQL查询,我们可以更好地使用原始SQL编写它)?
谢谢
发布于 2022-07-03 08:59:41
好吧,有一个案子可能真的很突出。当Include()-ing是一个集合时,EF总是生成外部联接。如果我们事先知道没有孩子的父母不存在(或者我们不需要他们),就无法指示EF为Include生成内部连接,而外部(最差)和内部连接(最好)之间可能有很大的性能差异。
对我来说,这已经够烦人的了,让我不得不使用coin an IncludeInner方法,不幸的是,这个方法被拒绝了(而且,公平地说,我没有提交拉请求)。
从EF的角度来看,生成外部联接是有意义的。毕竟,像.
context.Parents.Include(p => p.Children)...is希望把所有的父母都送回去,而不仅仅是那些有孩子的父母。
因此,如果我们对有孩子的独生子女父母感兴趣,我们必须恢复到这样的查询:
context.Parents.Include(p => p.Children)
.Where(p => p.Children.Any()现在我们有了一个OUTER JOIN和一个EXISTS谓词,它们都可以访问子表。如果性能非常关键,我们只能自己编写带有内部联接的SQL,或者使用join语句编写LINQ,而不是使用导航特性。
值得注意的是,与早期版本和esp相比,EF核心的查询生成总体上有了很大的改进。实体框架6(用于.net框架)。虽然EF6是可悲的,但我敢说EF6 6是现在最好的之一.(尽管GroupBy支持仍然是一个问题)。
发布于 2022-07-01 10:59:39
简短的回答是No
解释
EFCore ()并不是为了生成性能更好的查询,EFCore的目标仅仅是根据您提供的模型生成查询。EFCore将根据您试图实现的结果创建正确的查询。
查询只根据所涉及的导航属性和外键生成。
数据库主要使用索引统计信息来生成最佳查询计划,这与使用EFCore或普通SQL编写查询无关。
无论使用EFCore编写查询的方式如何,server都将始终选择最有效的计划。
拆分查询
EFCore提供了查询拆分,与旧的实体框架生成的单个查询中的许多联接相比,这导致了较小的数据集。
您可以在这里看到它:https://learn.microsoft.com/en-us/ef/core/querying/single-split-queries,它肯定比以前的实体框架更快。
我们已经看到使用拆分查询的查询时间从2秒下降到了20 We。有非常小的不一致,因为两者都发生在不同的时间,实际上是执行了许多单独的查询。但在很大程度上,它是足够和快速的。最好的部分是您可以使用.AsSingleQuery()来使用单个查询。
https://stackoverflow.com/questions/72733930
复制相似问题