【问题标题】:Performance problems after migrating ASP.NET Web Forms application using LINQ-to-SQL to SQL Server 2016使用 LINQ-to-SQL 将 ASP.NET Web 窗体应用程序迁移到 SQL Server 2016 后的性能问题
【发布时间】:2019-12-06 16:42:03
【问题描述】:

我一直在对旧版 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 的调用次数大致相同,但 DB 管理员断言这并没有什么意外。而且他自己对跟踪表的检查也没有发现任何危险信号。

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

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

  • Windows Server 2016
  • IIS 10
  • .NET Framework 4.6.2
  • SQL Server 2016 (13.0.5366.0)

对我们如何解决这个问题有什么建议吗?

【问题讨论】:

  • 2014 年基数估计发生了很大变化;有很多关于这个主题的文章。#
  • @Larnu 您是否认为基数估计器的变化会导致速度缓慢,即使每个单独的查询都在几毫秒内运行?查询之间的时间似乎占报告生成所需总时间的很大一部分。
  • @Micheal;如果有帮助,请标记答案,如果有帮助,请发表评论。

标签: sql-server vb.net linq-to-sql webforms


【解决方案1】:

由于架构或加载数据的方法不正确导致向数据库服务器发送过多请求。 当您使用“延迟加载”(即 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多