【发布时间】:2015-10-30 03:10:07
【问题描述】:
我有一个性能问题,我们进行了一堆分析并被卡住了。希望你们中的一个人以前见过这个。
我正在调用DbContext.Database.SqlQuery,数据库部分需要 3 毫秒,但完整执行需要 9 秒。
我们使用 EF Profiler 发现了这一点,我们还直接在 SQL Server Management Studio 中运行 SQL,它是即时的。
我们还使用了 glimpse,但无法深入了解该过程。
结果类型不是模型中的实体,因此我们确信不涉及跟踪。
我们也知道这不是针对上下文执行的第一个查询,因此我们不会为此查询支付 EF 启动成本。
我们尝试了 .net 分析器,但在运行它时遇到了很多问题,所以我们决定直接询问。
关于如何挖掘和解决这个问题的任何提示?
编辑:此查询的结果集是 1 行 4 列(十进制)
这行代码就是:
var list=contextInstance.Database.SqlQuery<nonEntityType>(sqstring).ToList();
SQL 本身并不是一个很长的字符串。我们将使用更详细的分析器来找出进程中挂起的位置。
【问题讨论】:
-
我能想象的唯一一件事是,大量的数据在网络上传输,创建结果列表/数组/无论您正在处理什么结果都需要时间。这不是以 SQL 执行时间来衡量的
-
@DavidLeitner 我认为这不是索引* 问题,因为查询本身在 SQL Server 中执行得非常快。所以这是在查询被推入数据库之前或在出路之前的事情。没有一个 LINQ 查询显示出这种差异。 db 执行时间和完整的 EF 查询执行时间之间的跨度很小。 *我也一直想说指数! :) 永远不知道哪个是正确的! :)
-
你是
using上下文吗?你可以试试。此外,如果您不打算更新数据,您也可以尝试AsNoTracking()。哦,咔嚓。这不是DbSet。您能否将更多代码粘贴到问题中,例如 SQL 字符串和一些周边代码?在干净的上下文(使用 using)上尝试相同的查询,就像在单元测试中一样。 -
涉及多少数据?你是什么时间?我们可以看到一些代码吗?您使用的是什么提供商?您使用的是什么连接协议?这是 SQL Server 吗?您传递给类型参数的类型是什么样的?它在它的构造函数中做任何事情吗?你能用原始 ADO.net 代码尝试它到数据阅读器并填充你的类型,这将排除网络/协议问题。
-
使用 Intellitrace(在 VS Enterprise/Ultimate 中)
标签: c# .net entity-framework visual-studio-2013 profiling