Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 快速Oracle Select[海量数据]_Java_Oracle_Select_Jdbc_Performance - Fatal编程技术网

Java 快速Oracle Select[海量数据]

Java 快速Oracle Select[海量数据],java,oracle,select,jdbc,performance,Java,Oracle,Select,Jdbc,Performance,我有一个项目,我从Java的Oracle数据库中读取大量数据 我觉得我们正在编写的应用程序处理数据的速度将远远快于使用单线程SELECT查询提供给我们的速度,因此我一直在尝试研究获取数据的更快方法 有人有什么我可以读的东西可以帮助我摆脱困境吗?Oracle支持。这尤其适用于SELECT查询。最终的瓶颈可能是IO读取速度。使用速度更快的磁盘或将多个磁盘上的数据条带化 更新 如评论中所述,并行查询/DML是一个标准版本,在标准版中不可用 此外,并行DML/Query并不是所有性能问题的解决方案。由于

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

我觉得我们正在编写的应用程序处理数据的速度将远远快于使用单线程SELECT查询提供给我们的速度,因此我一直在尝试研究获取数据的更快方法

有人有什么我可以读的东西可以帮助我摆脱困境吗?

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

更新 如评论中所述,并行查询/DML是一个标准版本,在标准版中不可用

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

从上面的链接:

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

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

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

在打开查询之前,对语句或PreparedStatement使用setFetchSize(int)方法。你应该尝试不同的尺寸。试着从75岁开始。 在一个稍有不同的用法上,人们说PL/SQL批量获取“最佳点”在2000到3000之间,但我看到一个基准测试表明75是最佳的。
较大的获取大小将减少客户端和服务器之间的往返次数。但是如果它太大,数据库必须有一个大的缓冲区,网络软件可能必须将大消息分解成许多数据包。

首先,“海量数据”对于数据库用户来说是[至少]千兆字节,在这种情况下,我怀疑您的问题将是将这些卷读入您的进程内存,并将它们聚合到内存中。为什么您认为单线程选择会成为瓶颈

如果瓶颈是从磁盘获取数据,那么让多个线程从同一磁盘提取数据并不一定更快,甚至可能更慢。但是,如果您可以将数据分散在不同的磁盘上,则不同的线程会更快。如果使用SSD,您认为磁盘不会成为争用点,那么我们可以到别处看看

如果瓶颈是网络带宽,那么多个线程也无法更快地通过管道容纳更多的数据。您甚至可以从将数据卸载到平面文件、压缩和传输中获益

如果select正在排序或来自散列联接,则可以通过单个线程更有效地使用内存。多个会话必须共享机器的内存

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


我同意布莱德利的观点,你应该先确定瓶颈。如果您有数据并选择了,它应该足够简单,以确定需要多长时间(在本地计算机上和通过网络),跟踪将是真正研究如何加速的必要起点。

或者,如果输出少于您选择的所有数据,那么在Oracle db(PL/SQL或Java)并行查询中运行的存储过程也将受到CPU的限制。也就是说,如果我们的服务器的CPU已经耗尽,我们将不会从PQ中获得任何好处。事实上,这可能会让事情变得更糟。通常的警告也适用于许可。并行查询是企业版的一项功能。我不认为CPU的数量或磁盘的速度会是一个问题。我不太担心这一点,因为我知道db运行的是固态磁盘。读取多线程似乎是最好的方法,这样我们可以尽可能多地使用该框,并尽可能快地将内容读入应用程序。@APC:当然,我更新了我的答案,添加了一条必要的警告。不幸的是,由于我们系统的性质,我们需要所有信息才能完成任何处理(许多不同系统价值的数据的聚合,并非全部来自oracle)我当然会考虑做一些存储过程的处理,但是我必须阅读大部分的数据。@ PintSizedCat - OK,听起来有点特殊,但是你应该做一些测试来证明Oracle的结果集传输是在继续过多之前的实际瓶颈。@ PintSizedCat:你有没有想过?额定瓶颈在哪里?您是否在DBMS\u MONITOR.SESSION\u TRACE\u ENABLE()和DBMS\u MONITOR.SESSION\u TRACE\u DISABLE()中运行SQL包装调用以获取等待信息?您是有意还是无意地对数据进行排序?我还没有,我想通过学习一些关于oracle的知识以及我可能如何做到这一点,从而在项目上取得一个飞跃。我们明天开始。我将做你们两人陈述和fin的事情