当前位置: 首页 > 知识库问答 >
问题:

升级到Oracle 19c后,Web app的性能变慢

明松
2023-03-14

我有一个c#MVC web应用程序(.NET 4.52),使用较旧版本的Devart LinqConnect构建数据库等。该应用程序已有10年的历史,Oracle 11g后端数据库没有问题。

我们的DBA团队导出了模式/数据库并将其导入到Oracle 19c环境。自从将Web应用程序重定向为在19c上使用新模式以来,我们看到了对性能的巨大打击。

经过大量的调试,我已经瞄准了一个小到足以测试一些想法的表,因为它在性能不佳的页面上驱动视图。当我说不好的时候,它的渲染时间在11g上平均为2秒,现在在19c上需要25秒。

我使用LINQ语句隔离了一行代码,以从其中一个实体中获得一个经过筛选的数据集(该数据集返回13条记录,所以实际上没有多少)。

在Devart中有一个功能。ExecuteQuery

 _dbContext.ExecuteQuery<T>("sql here");

相反,问题依然存在。为清楚起见,SQL语句只不过是:

SELECT * FROM tableA WHERE condition1='Y' and condition2 = 'Y'

直接在TOAD中运行完全相同的SQL语句速度非常快,结果在不到一秒钟的时间内返回。

  • 我已经将Devart LinqConnect升级到他们的最新版本(截至昨天)。
  • 我在LinqConnect的ORM的帮助下重新创建了模型(这是为了消除任何可能在19c上运行不佳的遗留设置

尽管采取了上述步骤,我仍然没有看到任何积极的结果。我甚至在中创建了一个全新的测试应用程序。NET Core 3.1使用Nuget的Oracles EF包。我构建了数据库,在同一个表上进行了一些数据检索,得到了相同的性能问题。它似乎与此表中的两个CLOB字段有关。它们中没有太多内容,因为它们只是测试记录,但我想数据类型的性质导致了自迁移到19c以来出现的一些错误。

在测试应用程序中,使用选项“Direct=true;”实际上,连接字符串将表上的响应时间缩短到了3秒左右。但是,此设置对使用Devarts自己的驱动程序的主应用程序没有任何明显的影响。

然而,我确实在Devart ORM中找到了一个设置,用于表/模型的字段“延迟加载”。我尝试了一下,为CLOB字段和voila启用了延迟加载,响应时间恢复正常。我想这是因为CLOB字段中的数据没有被实时访问,但可能更像是字段级别的延迟加载?

不幸的是,这并不能解决这个问题,因为结果被传递回链中,一些代码将结果放入另一个数据模型中,该模型包含来自相关实体表的更多数据。

public statifc Func<CustomerTable, CustomerViewModel> CustomerViewModelProjection
{
    get 
    {
         return cust => new CustomerViewModel 
         {
             Name = cust.Name,
             Surname = cust.Surname
             Age = (int?) cust.Age
             Rating = cust.Billing.Max(x => x.BillingStatic.RatingName)
         }
    }
}

尽管其他实体表中没有其他CLOB字段(我可以找到),但在下一段代码中的性能也非常糟糕。它基本上是从第一次调用中获取结果,并生成一个更友好/丰富的版本,可以通过延迟加载来拉入链接数据。

上面的示例并没有反映实际的代码,但为您提供了一个想法。正在创建的新模型甚至没有引用第一次调用中的CLOB字段。因此,尽管启用了“延迟加载”,但这段代码的行为就像出于某种原因在后台访问这些字段一样。当然,这只是猜测。

总结:

  • 问题始于将后端数据库从Oracle 11g重定向到19c。
  • 没有进行任何代码更改。
  • 据我所知,LINQSQL不是问题。
  • 使用Devart最新的LinqConnect软件完全重新创建实体模型没有产生明显的影响。
  • CLOB似乎确实在性能影响中扮演着直接的角色,但为什么会发生这种情况?

我有兴趣了解可能的原因。我的直觉是它与CLOB的预取有关。我只是无法确定为什么从11g更改为19c会导致这样的问题。同样,在TOAD中运行这些语句很好且响应迅速,它只是在Web应用程序和数据库之间。数据库托管在云中,响应时间约为350毫秒。

如果有帮助的话,我刚刚还尝试使用OracleCommand方法来否定与EF/Devart有关的任何内容。当涉及到这些Clob时,我仍然看到相同的性能受到影响。在下面的粗略示例中,13条记录需要大约14秒才能迭代。如果我注释掉两个clob字段,迭代速度很快/几乎是即时的。在其他使用连接字符串中的“Direct=true”的测试运行中,对提高性能没有太大帮助/做任何明显的事情。

var con = new OracleConnection("connstringhere");
con.Open();
var cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM tableA WHERE condition1='Y' and condition2 = 'Y'";
OracleDataReader dr = cmd.ExecuteReader();

while (dr.Read())) {
  var d1 = dr["ID"];
  var d2 = dr["CLOBFIELD1"];
  VAR d3 = dr["CLOBFIELD2"];
}

共有1个答案

赫连晋
2023-03-14

好的,全部排序。问题实际上是数据库相对于应用服务器的地理位置。请记住,我们的业务在英国和香港都有办事处,因此该数据库由英国的app server托管在香港。这两者之间的距离是问题的症结所在(我猜数据库调用以更高的延迟进行往返使事情更加复杂)。当我们使用英国的另一个数据库实例进行测试时,问题得到了解决。无论如何,对我们来说,这个故事的寓意是将数据库和应用服务器保持在同一个区域。

 类似资料:
  • 我已将小应用程序更新到Grails 3.2.3。经过一些问题,现在解决了Grails 3. x更新-bootRun失败 但不幸的是,该应用程序无法使用。在我的高端笔记本电脑ThinkPad 460p上,我甚至无法加载应用程序的主页。它正在加载很长时间,然后CSS样式根本没有加载。圣杯运行应用程序或IDEA运行配置没有错误消息。 我不知道现在该怎么做,这里描述了所有配置Grails 3.x更新-bo

  • 我将我的linux box从7.8升级到了用于CI服务器的8.7。每当我开始詹金服务 >sudo/etc/init.d/Jenkins start 我得到以下错误消息。 [...]启动jenkins(通过systemctl):jenkins.ServiceJob for jenkins.Service失败。有关详细信息,请参阅'SystemCTL status Jenkins.Service'和'

  • 我用Play2.0创建了一个应用程序。我实现了scribe-java库来使用一些OAuth服务。直到今天,一切都很好,但当我升级jdk并重新启动服务器时,我不能使用scribe-java库。它似乎在sun.security包中使用了和类,但找不到。 “java-version”返回: 播放2.0 StackTrace:

  • 升级flutter后,iOS模拟器的性能变得如此糟糕。例如,启动慢,显示键盘慢。 我查了颤振医生。这是我的结果。

  • 我重新安装了最新版本的Android Studio,之后我无法运行任何应用程序。 以下是我发现的: 我正在使用: Android Studio 3.1 JDK ver。1.8.0_161 Gradle Ver。4.4 Android插件版本3.1.0 也是Android.enableaapt2=false 我所尝试的: 运行以前的应用程序 创建新项目并运行它 清理/重建