1.6 数据库链接调用

过度使用数据库链接调用会影响应用程序的性能。在一个循环中通过数据库链接来访问远程表或修改远程表是一个不可扩展的方法。因为对远程表的每一次访问,都会导致本地数据库和数据库链接中包含的远程数据库之间的多个SQL*Net包的交换。如果数据库在地理上处于不同的数据中心,或者更糟糕一些,数据库是跨国的,那么等待SQL*Net的流量就会导致程序的性能问题。

在代码清单1-14中,游标每返回一行,远程数据库上的customer表都要被访问一次。我们假定一次网络往返需要0.1秒,那么100万次往返调用将需要大约27小时才能完成。而位于国内不同地区的数据库之间的响应时间为0.1秒是很常见的。

代码清单1-14 过度使用数据库链接调用

慎重地使用实体化视图能减少程序执行中的网络往返。在代码清单1-14的案例中,可以为远程customer表创建一个本地实体化视图。在程序执行前先刷新实体化视图,然后在程序中访问实体化视图,将表在本地实体化减少了SQL*Net往返调用次数。当然,作为应用程序的设计者,你需要比较实体化整个表和在循环中访问远程表的代价,选择最理想的解决方案。

另一种选择是将程序改写为使用远程表连接的SQL语句。Oracle数据库的查询优化器能优化这种语句,以减少SQL*Net往返的开销,而要使用这种技术,就需要重写程序,使这个SQL语句只执行一次,而不是循环执行。

调优代码清单1-14中程序的首选步骤是将数据实体化到本地或将代码改写为包含远程连接的SQL语句。不过,如果你无法做到这些,还有另外的解决办法。作为一个临时措施,你可以将程序转化为能够使用多进程架构。例如进程1处理1~100 000范围内的客户,进程2处理100 001~200 000之间的客户,等等。把这种逻辑应用到示例程序,创建10个并行执行进程,你就可以将程序的总运行时间减少到大约2.7小时。另一种可采取的方法是使用DBMS_PARALLEL_EXECUTE,将代码分解成多个任务并行处理。

目录