2016-01-13 111 views
1

在我的项目中,我们正在从我们的C++应用程序调用oracle程序, 由oracle提供的Pro * C/C++库的帮助。当应用程序多次调用数据库过程时,性能是否会受到影响?

我们有一个大的程序,我的想法是将程序拆分为两个模块。但是他们的建议是一次调用这个程序,并且一次执行所有的工作。

我从他们那里得到的原因是它会引起性能影响,因为应用程序与数据库多次交互。

我同意,当应用程序连接数据库,调用过程并最终断开每个过程调用的数据库时,上述情况就会发生。但是,我们真正做的是在启动时创建连接池,并重新使用预连接的数据库连接与数据库进行交互。

我的应用程序:

  1. 这是multi-threaded application,它可以处理大约每秒1000请求与线程池的大小为20,目前为每一个请求,我们与数据库进行通信的4倍。

编辑:

“PLSQL和SQL之间的切换是不是周围的其他方法快得多”。 Q1。这是如何与我的实际问题有关?我的问题是关于将程序分成两个相等的部分。假设我有4个查询在程序中执行,我只是将它分成两个程序a和程序b,每个程序都有两个查询。

“调用PLSQL的pro * c调用性能受到影响”。 Q2。你是指应用程序(pro * C/C++)和数据库(oracle)之间的通信吗?如果是这样,沟通是一个很大的表现?

在你连接的问题tom链接中,“但是不要害怕从PLSQL调用SQL - 这是PLSQL最好的” Q4。在我们从PLSQL中调用SQL的时候,Wheather context switch会发生什么?因为按照上述说法,这似乎没有影响。

+1

您是否测量了它,看看真实世界的影响是什么? –

回答

1

您的建议是正确的,一次执行所有数据库任务会更好。在您的场景中有两个主要的性能影响

  1. 在SQL引擎和PL/SQL引擎之间切换pro * c的上下文以多次运行您的线程。通常来自客户端应用程序的许多PL/SQL调用中的最大问题。
  2. 您的pro * c应用程序和数据库引擎之间的通信中的网络堆栈开销(TNS) - 特别是如果您的应用程序位于不同的物理主机上。

话虽如此,你正在应用程序端创建一个连接池,TNS监听器还应该有一个等待每个网络连接(这是在listener.ora中设置)的遗留服务器阴影进程池。

当影子进程已经在等待连接时,OCI登录/注销非常快,并且不是延迟的一个重要因素 - 我不担心这种情况,除非服务器上的新影子进程必须启动 - 然后它可能是一个非常昂贵的电话。当你在客户端使用连接池时,这通常不是问题,而只是由于线程在你的调用中需要考虑的问题。一旦你耗尽了服务器影子进程池,如果TNS监听器必须启动更多的服务器影子进程,你会发现一个巨大的降级。

编辑在回答新问题:

  1. 这是非常相关的。如前所述,您应该尽量减少C++应用程序中的plsql和sql调用的数量。在C++应用程序调用中的每个PLSQL调用都会调用SQL引擎,然后调用PLSQL引擎进行过程调用。所以,如果你将你的过程分成两部分 - 你将SQL翻倍到PLSQL上下文切换,这是Tom Kyte文章和我自己的个人经验概述的更加昂贵的切换。

  2. 在1中回答。但正如我之前所说的,除非您的主机位于不同的物理网络和您正在传输的数据类型,否则通信开销是第二。例如,大量的C++对象参数和带有很多调用的大Oracle结果集显然会影响往返的通信延迟。请记住,通过更多的PLSQL调用,您还可以为每个连接和结果集的设置添加更多的SQLNET流量。

  3. 没有3问题

  4. PLSQL到SQL中的PLSQL引擎是可以忽略不计,所以不要得到挂掉电话就可以了。将所有的SQL调用放在1个PLSQL调用中,以获得最大的性能吞吐量。不要将这些电话分开,只是为了更加雄辩地表现昂贵的表现。

+1

我明白了,plsql引擎是不同的,而且sql引擎是不同的。由于两个引擎不同,所以上下文切换需要时间。考虑我将我的程序分成两个相等的部分。根据我的不确定的上下文切换将发生在过程中的每个sql查询。 因此,即使我们拆分过程,上下文切换也会发生相同的次数。我的理解是否正确? –

+0

你几乎是正确的 - PLSQL和SQL之间的切换比其他方式快得多。所以在你的1或2个PLSQL调用中有几个SQL调用,我不会太担心。然而,有很多调用SQL的pro * c调用,然后是PLSQL例程等等 - 我多次看到这是一个很大的性能问题。更多信息在这里:https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:60122715103602 –

+0

请在问题中找到编辑并回复 –

相关问题