EF6 SQLQuery非常慢,但数据库速度非常快

时间:2015-08-06 20:01:14

标签: c# .net entity-framework visual-studio-2013 profiling

我遇到了一个性能问题,我们已经做了很多分析并且卡住了。希望你们其中一个人以前见过这个。

我调用DbContext.Database.SqlQuery数据库部分需要3ms,但完整执行需要9秒。

我们已经使用EF Profiler来发现这一点,我们也直接在SQL Server Management Studio中运行SQL,它是即时的。

我们也使用了一瞥而无法深入了解这个过程。

结果类型不是模型中的实体,因此我们确信不涉及跟踪。

我们也知道这不是针对上下文执行的第一个查询,因此我们不会在此查询中支付EF启动成本。

我们尝试过.net分析器并且运行它时遇到很多问题,我们决定应该问一下。

有关如何挖掘和解决这个问题的任何提示?

编辑:此查询的结果集为1行,包含4列(十进制)

代码行只是:

var list=contextInstance.Database.SqlQuery<nonEntityType>(sqstring).ToList();

SQL本身不是一个很长的字符串。我们将使用更详细的分析器来找出这个过程中的哪个位置。

2 个答案:

答案 0 :(得分:1)

  

我们使用EF分析器来发现这一点,我们也运行SQL   直接在SQL Server管理工作室中,它是即时的。

这并不能证明什么。查询可能运行得很快,但数据可能会产生100MB的数据,然后传输到客户端并在对象中实现。这可能比您想象的要花费更多时间。

SSMS中的查询可能会立即返回,因为它只显示部分数据。你没有说出数据是什么。

使用真正的.NET分析器,如dotTrace或Ants。通过这种方式,您可以看到完全在线上丢失时间的位置。 EF教授(或我自己的ORM Profiler:http://www.ormprofiler.com)将告诉您采取的总路线的哪一部分(ORM-> DB-> ORM)需要花费的时间。即使是EF教授也可以;)

答案 1 :(得分:1)

如果客户由于某种原因无法使用分析器,因为Frans建议您必须玩猜谜游戏并排除可能性。

首先,我认为缺少一条关键信息。它总是需要大约9秒钟或者它会变化吗?

第一步:

确定延迟是在查询到达数据库之前还是之后。应该可以使用EF profiler并查看Sql Profiler中的时间戳。

无论哪种方式,你都会限制一些可能性。

第二步:

尽可能排除

  • 索引(不,查询速度快)
  • 返回太多数据(不,根据您的信息)
  • 慢查询编译(不,使用原始sql查询)
  • 数据传输速度慢(不,其他查询效果很好)
  • 慢速DbContext初始化(不,你说它不是第一个查询)
  • 行或表锁(不太可能,这可能会在分析器中显示为长时间运行的查询)
  • 缓慢的实现(不,除非有严重的边缘案例错误,否则为少数字段)

第三步:

剩下的是什么?这取决于#1的答案以及它是否总是9秒。

我的主要怀疑是这是一些连接问题,因为另一个调用阻塞,所以它必须等待连接或某个二级缓存或者对此查询不起作用的东西。

为了排除更多替代方案,我会尝试使用普通的旧ADO.NET运行相同的查询。如果问题仍然存在,则您知道它不是EF问题,很可能是连接问题。如果它消失了,它仍然可能是两个问题。

并不像一些咆哮那样回答,但希望你已经没有想到的事情了。