【问题标题】:Issue with .NET LINQ query preparation.NET LINQ 查询准备问题
【发布时间】:2019-04-19 15:37:49
【问题描述】:

我们在 linq 查询中遇到问题。在选择查询中,多个表与联接关联。在连接部分应用记录过滤器的位置。

自过去 8 到 9 个月以来,此查询运行良好并在一段时间内给出了正确的结果。 突然间,用相同的连接和消耗 99% 的 CPU 检索记录需要大约 2 分钟的时间。

在用户登录时始终使用此查询,因此可以确保它在过去一直运行良好,直到发布时刻。 任何人都可以解释为什么这个问题突然发生?

var entityList = (from x in db.TableA
    join y in db.TableB on x.Id equals y.TableC.TableAId into g
    from d in g.DefaultIfEmpty()
    where d.EndDateTime == null &&
          (d == null || d.TableE.PersonID == personId) &&
          x.EndDateTime == null &&
          d.TableC.EndDateTime == null &&
          x.TableE.PersonID == personId
    select new
    {
        Col1 = d != null ? d.TableC.TableD.Id : 0,
        Col2 = d != null ? d.TableC.Id : 0,
    }).AsQueryable();

【问题讨论】:

  • 数据库的大小可能已经增长或变得碎片化。请参阅:dev.mysql.com/doc/refman/8.0/en/innodb-file-defragmenting.html
  • 这可能是一百万件事,索引问题,磁盘损坏,网络速度等。恐怕您需要自己深入研究。从提取正在执行的查询开始,看看它是什么样子的。对数据库手动运行它,那里慢吗?检查执行计划等。
  • 请提供SHOW CREATE TABLE、生成的SELECTEXPLAIN SELECT ...以及表格的大概大小。
  • @jdweng - 碎片整理不会导致超过百分之几的性能损失。

标签: c# mysql performance entity-framework linq


【解决方案1】:

如果该框架将d == null 变成d = null 而不是d IS NULL,这是一个严重的缺陷。

OR 会影响性能。您真的需要dNULL 选项吗?有哪些索引?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多