[英]EF query performance issues
如果我只将createdFromDate
传递给下面的lambda,我的查询在大约300ms完成。 但是如果我传递id
参数,我最终会在20-30秒内结束。 传递id
变量时有什么方法可以改进查询吗?
List<MYENTITY> list= ctx.MYENTITY.Where(s =>
(string.IsNullOrEmpty(createdFrom) || s.CREATE_DATE >= createdFrom) &&
(string.IsNullOrEmpty(id) || s.ANOTHER_ENTITY.FirstOrDefault().ID == id)
.ToList();
我怀疑这不是EF的错。 我要做的是捕获EF生成的查询,将其粘贴到SSMS中并查看查询计划。 我的猜测是正在进行表或索引扫描,因为缺少索引。 或者,索引存在但未被使用,可能是因为索引中应包含一个或多个列。
一个简单的尝试:
List<MYENTITY> list = ctx.MYENTITY.Where(s =>
string.IsNullOrEmpty(createdFrom) || s.CREATE_DATE >= createdFrom)
.ToList()
.Where(s2 => string.IsNullOrEmpty(id) || s2.ANOTHER_ENTITY.FirstOrDefault().ID == id)
.ToList();
这不是一个解决方案,但如果它加快了速度,那么我建议查看你的代码,如果速度保持不变,我建议你查看你的数据库结构。
你能不能得到以下评估的ID:
s.ANOTHER_ENTITY.FirstOrDefault().ID
即int? anotherEntityId = s.ANOTHER_ENTITY.FirstOrDefault()。ID;
并使用它代替上面的代码行。
我认为在where子句中包含它实际上很可能(取决于用于获取此实体的ef查询)导致最终的sql查询成为一团糟。
至少我认为值得测试。
也就是说你可以将anotherEntityId替换为某个已知值并进行测试,如果它很慢那么就是它的评估
s.ANOTHER_ENTITY.FirstOrDefault().ID
这才是真正的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.