繁体   English   中英

EF查询性能问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM