首页 > 解决方案 > 使用 LINQ-to-SQL 将 ASP.NET Web 窗体应用程序迁移到 SQL Server 2016 后的性能问题

问题描述

我一直在对遗留 Web 应用程序进行一些维护,使用 ASP.NET Web 窗体、VB.NET 实现,并使用 LINQ-to-SQL 进行数据访问。

我们最近将应用程序从 SQL Server 2005 迁移到 SQL Server 2016。从那时起,以前需要几秒钟才能生成的报告现在需要几分钟。

报告生成的设计有些欠佳。为了生成单个摘要报告,我们运行了大约 100 个查询,然后将结果拼凑到最终报告的代码中。我会更喜欢一种设计,让一个查询完成数据库中的所有工作。

我们让我们的数据库管理员在测试时运行了一个分析工具。在他提供的跟踪表中,我看到了大约 200 个与报告生成相关联的条目。使用sp_executesql (由 LINQ-to-SQL 生成)的数据访问查询刚刚超过一百个,每个查询最多只花费几毫秒。对sp_reset_connection的调用次数大致相同,但数据库管理员断言这并没有什么意外。而且他自己对跟踪表的检查也没有发现任何危险信号。

不幸的是,在我们进行测试时,Web 服务器的管理员没有可运行的分析工具,我无法在本地机器上运行该应用程序来进行自己的分析。

关于我们的配置的更多细节:

关于我们如何解决这个问题的任何建议?

标签: sql-servervb.netlinq-to-sqlwebforms

解决方案


由于糟糕的架构或加载数据的方法导致向数据库服务器发送过多的请求。当您使用“延迟加载”(这是 Linq 2 SQL 中的默认方法)方法加载数据并尝试在“foreach”块中加载相关数据时“发生了太多请求。

加载问题的解决方案:Eager Loading

DataLoadOptions Load = new DataLoadOptions();  
Load.LoadWith < Department > (d => d.Employees); 

有关如何加载数据的详细日志:

dbContext.Log = Response.Output;  //<or any way you trace, debug or ...>

此外,“sp_reset_connection”发生在 SQL 连接返回连接池时,现在这应该不是问题。

阅读更多信息: https ://www.c-sharpcorner.com/article/lazy-loading-and-eager-loading-in-linq-to-sql/


推荐阅读