wis*_*ame 6 oracle performance tns
我正在研究一个非常慢的SQL查询(源自使用JBoss 5.1中部署的Hibernate的Java应用程序).此特定查询返回了大约10K记录,但仍然需要40秒或更多.
我最终用数据库嗅探了流量(wireshark有一个TNS的解剖器)并发现了一些意想不到的东西.当数据来自服务器时,每个结果行都在其自己的TNS数据包中.此外,在从数据库发送下一个TNS数据包之前,客户端(即应用服务器)确认每个TNS数据包.对于10K记录,有10K往返来获取数据包并确认它.对性能的影响是巨大的.
这非常低效.TCP允许更大的数据包并具有许多机制(滑动窗口,延迟的ACK)以减少延迟并提高吞吐量.但是,在这种情况下,它是顶部的TNS协议,它增加了自己的协商.
如果我从Oracle的SQL Developer运行相同的查询,我看不到这种模式.查询在大约1/10的时间内完成,没有数千次往返.
简短版本:Oracle的有线协议(TNS)似乎在每个查询结果行的一个TNS数据包中传递数据,并要求在服务器发送下一个数据包之前由客户端确认每个数据包.
我已经找到了一些关于这个[这里] [1]的信息(向下滚动直到关于'tnsnames.ora文件中的SDU和TDU参数'部分).
因此我的问题是:是否可以控制Oracle驱动程序的行为(我使用10.2.0.4.0),因此TNS协议更有效?同样,这是一个在JBoss中部署的非常标准的J2EE应用程序.
非常感谢!
调整tnsnames.ora和listener.ora中的SDU和TDU参数
要将当前法规的批量大小设置为100.
  ((OracleStatement)stmt).setRowPrefetch (100);
注意:
设置预取大小可能会影响应用程序的性能.增加预取大小将减少获取所有数据所需的往返次数,但会增加内存使用量.这取决于查询中列的数量和大小以及预期返回的行数.它还取决于JDBC客户端计算机的内存和CPU负载.独立客户端应用程序的最佳选择将与负载很重的应用程序服务器不同.还应考虑网络连接的速度和延迟,也应考虑连接
可用连接属性在这里.
另外还要看看Oracle UCP.