快速Oracle选择[大数据]

时间:2010-02-25 14:06:02

标签: java oracle select jdbc performance

我有一个项目,我正在从Java中读取Oracle数据库中的大量数据。

我感觉我们正在编写的应用程序将比使用单线程SELECT查询给我们的速度更快地处理数据,所以我一直在尝试研究更快的获取数据的方法。

有没有人能阅读任何可以帮助我解决困境的事情?

4 个答案:

答案 0 :(得分:3)

Oracle支持parallel DML。特别是这适用于SELECT查询。最终,瓶颈可能是IO读取速度。使用速度更快的磁盘或在多个磁盘上条带化数据。

更新

在评论中注明的APC 并行查询/ DML Entreprise Edition feature,在标准版中不可用。

此外,并行DML /查询不是所有性能问题的解决方案。由于查询将使用多个进程,因此可能会提高吞吐量,但会以并发为代价。并行的目的是使用更多资源来更快地处理查询。如果查询是IO绑定的或CPU绑定的,则没有额外的资源可供使用,添加并行性只会使事情变得更糟。

从上面的链接:

  

并行执行通常不正常   适用于:

     
      
  • CPU,内存或I / O资源已经存在的环境   大量使用。并行执行   旨在利用额外的   可用的硬件资源;如果不   那么这些资源是可用的   并行执行不会产生任何结果   好处,实际上可能是有害的   表现。
  •   

答案 1 :(得分:3)

您还没有向我们提供很多信息,说明为什么需要将“大量数据”引入Java应用程序而不是在数据库端处理它。虽然可以有例外,但通常这是重新思考设计的信号。作为Oracle的一般规则,使用纯集合操作(​​SQL)执行尽可能多的工作是最有效的,然后使用rdbms引擎(PL / SQL)进行过程处理,然后将结果返回给客户端应用程序。

答案 2 :(得分:3)

在打开查询之前,在Statement或PreparedStatement上使用setFetchSize(int)方法。你应该尝试不同的尺寸。尝试75作为起点。

在一个稍微不同的用途上,人们说PL / SQL批量获取“甜蜜点”在2000到3000之间,但我看到一个基准,表明75是最佳的。

较大的提取大小往往会减少客户端和服务器之间的往返次数。但是如果它太大,数据库必须有一个很大的缓冲区,而网络软件可能不得不将大消息分解成很多数据包。

答案 3 :(得分:2)

首先,数据库人员的'巨大数据'至少是[千兆字节],在这种情况下,我怀疑你的问题是将这些卷读入你的进程内存并在那里聚合它们。为什么你认为单线程选择会成为瓶颈?

如果瓶颈是从磁盘获取数据,那么让多个线程从同一磁盘中提取数据不一定会更快,甚至可能更慢。但是,如果您可以将数据分散到不同的磁盘上,则单独的线程会更快。如果使用SSD,您认为磁盘不会成为竞争点,我们可以在其他地方寻找。

如果瓶颈是网络带宽,那么多个线程再也不能通过管道适应更多数据。您甚至可以将数据卸载到平面文件,压缩并传输数据。

如果正在对选择进行排序或来自散列连接,则可以使用单个线程更有效地使用内存。多个会话必须共享机器的内存。

如果存在CPU密集型处理,则多个线程可能会有所帮助。这可能就像拥有来自java的多个连接一样简单,每个连接获得不同的数据切片(例如A-K和L-Z),但它在很大程度上取决于SELECT。

我同意dpbradley你应该首先确定瓶颈。如果你有数据和选择,它应该足够简单,以确定它需要多长时间(在本地机器上和通过网络),并且跟踪将是一个必要的起点,以真正了解它如何加速