【发布时间】: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、生成的SELECT、EXPLAIN SELECT ...以及表格的大概大小。 -
@jdweng - 碎片整理不会导致超过百分之几的性能损失。
标签: c# mysql performance entity-framework linq