作者:玉米猴子_794 | 来源:互联网 | 2023-10-13 10:41
我一直在使用ASP.NET Web窗体,VB.NET以及使用LINQ-to-SQL进行数据访问的旧版Web应用程序进行一些维护。
我们最近将应用程序从SQL Server 2005迁移到了SQL Server2016。此后,以前需要花费几秒钟才能生成的报告现在要花费几分钟。
报表生成的设计有些次优。为了生成单个摘要报告,我们运行了大约100个查询,然后将结果拼写到最终报告的代码中。我本来希望有一个查询可以完成数据库中所有工作的设计。
在测试时,我们让数据库管理员运行了概要分析工具。在他提供的跟踪表中,我看到了大约200个与报告生成相关的条目。使用 sp_executesql (由LINQ-to-SQL生成)的一百多个数据访问查询,每个查询最多仅花费几毫秒。 sp_reset_connection 的调用次数几乎相同,但是数据库管理员断言这没有什么意外的。而且他从自己的跟踪表检查中看不到任何危险信号。
不幸的是,在我们进行测试时,网络服务器的管理员没有可运行的性能分析工具,而且我无法在本地计算机上运行该应用程序来进行自己的性能分析。
有关我们配置的更多详细信息:
- Windows Server 2016
- IIS 10
- .NET Framework 4.6.2
- SQL Server 2016(13.0.5366.0)
关于如何解决此问题的任何建议?
由于架构错误或加载数据的方法而导致向数据库服务器发送过多请求。
当您使用“延迟加载”(Linq 2 SQL中的默认方法)方法加载数据并尝试在“ foreach”块“发生太多请求”中加载相关数据时。
加载问题的解决方案:急切加载
DataLoadOptions Load = new DataLoadOptions();
Load.LoadWith (d => d.Employees);
有关如何加载数据的详细日志:
dbContext.Log = Response.Output; //
此外,当SQL连接返回到连接池时,会出现“ sp_reset_connection”,这应该不成问题。
了解更多信息:
https://www.c-sharpcorner.com/article/lazy-loading-and-eager-loading-in-linq-to-sql/