EF SqlQuery查询比直接查询慢20倍是正常的吗?

时间:2016-10-26 18:57:15

标签: c# entity-framework

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

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

当我使用Entity Framework运行命令时,如下所示:

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毫秒。

我想知道这次演出是否正常,或者我是否遗漏了什么。

谢谢!

1 个答案:

答案 0 :(得分:0)

不,我不会说那是正常的。虽然有些东西EF和Linq-to-SQL做得不好导致一些可怕的执行查询,但使用where子句进行简单计数应该可以正常执行。

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