【问题标题】:Entity Framework Core is significantly slower for delete queryEntity Framework Core 的删除查询速度明显较慢
【发布时间】:2021-09-12 12:46:01
【问题描述】:

我使用EF Core在primary的基础上删除一行,执行时间超过1秒,否则简单创建一个删除命令只需要400毫秒左右。

我正在使用 Mysql 数据库。

直接使用Mysql删除一行仅需140毫秒。

为什么 EF 这么慢?

using (DBContex db = new DbContext())
{
    var revenueModel = db.Revenue.Where(x => x.Id == id).FirstOrDefault();

    if (revenueModel != null)
    {
        db.MSRevenues.Remove(revenueModel);
        result = await db.SaveChangesAsync();
    }
}

【问题讨论】:

  • 您需要向我们提供两者的解释计划,以便我们知道为什么它很慢。还有索引定义
  • 您正在从数据库中取出项目,检查它是否存在,然后将其删除。 2次去数据库。对命令执行相同操作,然后进行比较。如果你消除一次旅行,它会更快。
  • 如果这是“冷启动”,则加上 EF 构建模型所需的时间。无论如何,是的,比较是不公平的。
  • 而 140 毫秒是删除单行的非常长的时间。
  • @DavidBrowne-Microsoft 单行使用 PK 的实际时间应该是多少?

标签: c# .net entity-framework entity-framework-core


【解决方案1】:

EF Core 旨在仅通过 Change Tracker 修改数据库。这种设计使生活更轻松,但减慢了简单的操作。通常您必须选择实体,进行修改/删除和SaveChanges。这是两次数据库往返,加上查询翻译的时间。

无论如何,对于这种简单的情况,您可以通过简单的技巧消除一次往返:

_context.MSRevenues.Remove(new MSRevenue() { Id = id });
result = await db.SaveChangesAsync();

【讨论】:

  • 这有时被称为“存根实体”。
  • 感谢您的回答。我试过了,现在响应比以前要好,大约 900 毫秒,但仍然比普通的 sql 命令要好。
  • EF 不能像 sql 命令一样快......他们为生成查询、跟踪实体等创建了一些往返......
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 2022-01-25
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多