Sql 从oracle中提取所有记录的更快方法

Sql 从oracle中提取所有记录的更快方法,sql,oracle,performance,query-optimization,bulk-operations,Sql,Oracle,Performance,Query Optimization,Bulk Operations,我的oracle表包含9亿条记录,该表被划分为24个部分,并具有索引: 我尝试使用提示,并将fetch\u buffer设置为100000: select /+ 8 parallel +/ * from table 获得1亿张唱片需要30分钟 我的问题是: 有没有更快的方法来获取9亿(表中的所有数据)?我应该使用分区并执行24个顺序查询吗?或者我应该使用索引并将查询拆分为10个查询例如,网络几乎肯定是这里的瓶颈。Oracle并行性只影响数据库检索数据的方式,但数据仍然通过单个线程发送到客户端

我的oracle表包含9亿条记录,该表被划分为24个部分,并具有索引:

我尝试使用提示,并将fetch\u buffer设置为100000

select /+ 8 parallel +/
* from table
获得1亿张唱片需要30分钟

我的问题是:
有没有更快的方法来获取9亿(表中的所有数据)?我应该使用分区并执行24个顺序查询吗?或者我应该使用索引并将查询拆分为10个查询例如,网络几乎肯定是这里的瓶颈。Oracle并行性只影响数据库检索数据的方式,但数据仍然通过单个线程发送到客户端

假设单个线程还没有使您的网络饱和,您可能需要构建一个并发检索解决方案。表已经分区,这样就可以读取大块数据,而无需重新读取任何内容

我不知道如何在Scala中执行此操作,但您希望同时运行多个类似这样的查询,以尽可能使用所有客户端和网络资源:

select * from table partition (p1);
select * from table partition (p2);
...

不是一个真正的答案,但太长的评论

一些太多的变量可能会影响这一点,从而无法给出明智的建议,因此以下只是一些一般性提示

这是通过网络还是服务器上的本地?如果数据库是远程服务器,那么您将付出沉重的网络代价。我建议(如果可能的话)使用遗留协议在服务器上运行提取,以避免使用网络。一旦文件完成,is将比通过JDBC行处理将数据直接从数据库传输到本地文件更快地压缩和传输到目标

使用JDBC时,请记住设置光标获取大小以减少往返-
setFetchSize
。默认值很小(我想是10),试试1000之类的值,看看这有什么帮助

至于查询,您正在写入一个文件,因此即使Oracle可能会并行处理该查询,但您的写入文件过程可能不会,因此这是一个瓶颈

我的方法是编写Java程序,将一系列值作为命令行参数进行操作,并通过实验找出哪些范围大小和Java的并发实例可以提供最佳性能。该范围可能位于离散分区内,因此您将受益于分区修剪(假设范围值是一个索引列,理想情况下是分区键)


粗略地说,我将从5m范围开始,并运行与CPU核心数匹配的并发实例-2;这不是一个科学推导出的数字,只是我倾向于用它作为我的第一个尝试,看看会发生什么。

“花30分钟获得1亿条记录”让它知道有多少时间是查询时间,有多少时间是通过网络传输和在客户端渲染?数据库查询优化就是关于细节的。没有简单的启发式方法可以解决所有问题。请阅读。在我们尝试回答之前,我解释了您需要提供的信息,尽管我们可以说索引不能帮助您加快完整表的读取。我将它们提取到文件中,如何计算网络传输和客户端渲染的时间?我使用JDBCScala库来提取数据,使用您提到的分区,我可以在20分钟内获得4.55亿美元:)谢谢