【问题标题】:Is it normal for an EF SqlQuery query to be 20x slower than a direct query?EF SqlQuery 查询比直接查询慢 20 倍是否正常?
【发布时间】:2016-10-26 18:57:15
【问题描述】:

我正在尝试追踪性能问题。我正在对 SQL Server Express 数据库运行以下 SQL 查询:

SELECT COUNT(OrderID)
  FROM FutureOrderHeader
 WHERE ScheduledFulfillmentTime >= {0}
   AND ScheduledFulfillmentTime <  {1}
   AND SplitStatus <> 2
   AND Deleted = 0
   AND OrderMode = {2}

当我使用实体框架运行命令时,如下所示:

var results = ((DbContext)this._context).Database.SqlQuery<int>(SQL,start.BoxToSqlDataTime(),end.BoxToSqlDataTime(), (int)mode).Single();

如果我通过 ADO.NET 运行命令,它会慢大约 20 倍。使用 SQL Server Profiler 和 EF Profiler,我能够确定查询是相同的。大约通过 EF 执行此查询。 720次平均耗时2837ms。使用直接 ADO.NET 运行相同的查询平均需要 146 毫秒。

在 SQL Server Profiler 中,无论我使用的是 EF 还是 ADO.NET,实际执行的 SQL 文本以及持续时间、cpu 使用率、读取次数等都是相同的。根据 SQL Server Profiler,无论我使用的是 EF 还是直接 ADO.NET,查询本身都需要 0 毫秒到 2 毫秒。

我想知道这种性能下降是正常的还是我遗漏了什么。

谢谢!

【问题讨论】:

  • 这大概是EF模型的启动时间。在相同的上下文中第二次执行时它仍然很慢吗?
  • 在运行上述测试之前,我尝试通过运行其他一些查询来计算 EF 的启动时间。

标签: c# entity-framework


【解决方案1】:

不,我不会说这是正常的。虽然 EF 和 Linq-to-SQL 在某些方面做得很差,会导致一些可怕的查询执行,但使用 where 子句进行简单计数应该会执行得很好。

我建议分析调用中的 EF 调用以查看实际执行的内容。查看您提供的 EF 代码查询,它似乎不是同一个查询。然后,您可以更改 EF 代码或构建适当的索引以获得您正在寻找的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2021-03-09
    • 2015-05-23
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多