我遇到了一个性能问题,我们已经做了很多分析并且卡住了。希望你们其中一个人以前见过这个。
我调用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本身不是一个很长的字符串。我们将使用更详细的分析器来找出这个过程中的哪个位置。
答案 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中的时间戳。
无论哪种方式,你都会限制一些可能性。
第二步:
尽可能排除
第三步:
剩下的是什么?这取决于#1的答案以及它是否总是9秒。
我的主要怀疑是这是一些连接问题,因为另一个调用阻塞,所以它必须等待连接或某个二级缓存或者对此查询不起作用的东西。
为了排除更多替代方案,我会尝试使用普通的旧ADO.NET运行相同的查询。如果问题仍然存在,则您知道它不是EF问题,很可能是连接问题。如果它消失了,它仍然可能是两个问题。
并不像一些咆哮那样回答,但希望你已经没有想到的事情了。