sql-server - 使用 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 服务器的管理员没有可运行的分析工具,我无法在本地机器上运行该应用程序来进行自己的分析。
关于我们的配置的更多细节:
- 视窗服务器 2016
- IIS 10
- .NET 框架 4.6.2
- SQL Server 2016 (13.0.5366.0)
关于我们如何解决这个问题的任何建议?
解决方案
由于糟糕的架构或加载数据的方法导致向数据库服务器发送过多的请求。当您使用“延迟加载”(这是 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/
推荐阅读
- android - 如何在使用改造 android 发布数据后移动到另一个活动?
- java - 使用 Java 的 keycloak 离线令牌
- capl - 属于同一测试节点的特定测试用例组的测试报告拆分
- mysql - MySQL:通过 Node.js 中的存储过程保存 JSON 数据
- python - 当一个是部分的时覆盖两个 Pandas DataFrame
- c# - 如何通过id(主键)winforms删除listView中的选定项目
- java - Hibernate 错误,SQLGrammarException 的原因是什么
- elasticsearch - 某些属性或可参数化文件中的 Logstash Input -> JDBC?
- angular - 离子 5 连接本地主机 api
- java - Maven:如何在 Maven 项目中打包外部 jars(文件夹)