0

我有一个带有实体框架的 MVC4 应用程序用于数据访问。到目前为止,我的应用程序似乎运行良好,其中一个页面返回了大约 13,000 多行,并且连接超时。另外,在我尝试运行返回 13,000 多行的页面后,网站的其余部分也开始变得非常缓慢。虽然我使用的是相当复杂的 linq 查询,但我使用的是 Stack Exchange miniprofiler,并使用其中的 sql,我确定我的查询花费了不到一秒钟的时间(通过在 LINQ 查询中运行生成的 sql 来验证)直接 SSMS;可能需要 2 秒,顶部)。即使返回的结果集很小,分析器也会说类似“T+0.97ms,Reader 10393ms”。它最终会恢复正常。

我四处寻找有关 READER 声明告诉我的文档,但收效甚微。这是否意味着将结果流式传输回 Web 服务器所需的时间是多少?无论如何,如果有人知道这里会发生什么,我将不胜感激。如果有人想要,我可以发布 LINQ 代码,但就像我说的,我非常有信心它生成的 SQL 是好的。

谢谢

编辑:我可能会提到一件事:这是在中等信任下运行的共享托管环境中。此外,如果相关,这里是超时堆栈跟踪:

System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时时间已过或服务器没有响应。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,

4

1 回答 1

0

我相信我已经想通了。不幸的是,我并没有真正被允许发布代码,但事实证明,在我的 Linq 查询末尾添加 .AsNoTracking() 可以让阅读器执行时间缩短到大约 3-4 秒。我猜想在如此大的模型中启用更改跟踪来实现如此多的对象是瓶颈。这是可以接受的,因为这是一个只读列表。

@bleepzter,我尝试了你的建议,直接运行 Sql 要快得多,所以这绝对引导我走上解决方案的道路。

于 2013-03-29T17:49:39.623 回答