从 oracle 中提取所有记录的更快方法
the faster way to extract all records from oracle
我有 oracle table 包含 9 亿条记录,这个 table 分区到 24 个分区,并且有索引 :
我尝试使用 提示 并将 fetch_buffer 放入 100000:
select /+ 8 parallel +/
* from table
1亿条记录用时30分钟
我的问题是:
有什么方法可以更快地获得 9 亿(table 中的所有数据)?我应该使用 partions 并进行 24 个顺序查询吗?或者我应该使用索引并将查询拆分为 10 个查询,例如
网络几乎肯定是这里的瓶颈。 Oracle 并行性仅影响数据库检索数据的方式,但数据仍通过单线程发送到客户端。
假设单个线程尚未使您的网络饱和,您可能希望构建并发检索解决方案。这有助于 table 已经分区,然后您可以读取大块数据而无需重新读取任何内容。
我不确定如何在 Scala 中执行此操作,但您想 运行 同时进行多个这样的查询,以使用所有可能的客户端和网络资源:
select * from table partition (p1);
select * from table partition (p2);
...
不是真正的答案,但评论太长了。
太多变量会影响这一点,因此无法提供明智的建议,因此以下只是一些一般性提示。
这是通过网络还是本地服务器?如果数据库是远程服务器,那么您将付出沉重的网络代价。我建议(如果可能的话)运行使用 BEQUEATH 协议在服务器上提取数据以避免使用网络。文件完成后,与通过 JDBC 行处理将数据直接从数据库传输到本地文件相比,压缩和传输到目的地会更快。
使用 JDBC 记得设置游标提取大小以减少往返 - setFetchSize
。默认值很小(我认为是 10),试试 1000 之类的东西看看有什么帮助。
至于查询,您正在写入一个文件,因此即使 Oracle 可能会并行处理 查询 ,您的写入文件过程可能不会,所以这是一个瓶颈.
我的方法是编写 Java 程序以将一系列值作为命令行参数进行操作,并通过实验找出 Java 的哪个范围大小和并发实例可提供最佳性能.该范围可能属于离散分区,因此您将受益于分区 p运行ing(假设范围值是一个索引列,理想情况下是分区键)。
粗略地说,我将从 5m 的范围开始,运行 个与 CPU 核心数匹配的并发实例 - 2;这不是一个科学推导的数字,我倾向于将其用作我的第一次尝试,看看会发生什么。
我有 oracle table 包含 9 亿条记录,这个 table 分区到 24 个分区,并且有索引 :
我尝试使用 提示 并将 fetch_buffer 放入 100000:
select /+ 8 parallel +/
* from table
1亿条记录用时30分钟
我的问题是: 有什么方法可以更快地获得 9 亿(table 中的所有数据)?我应该使用 partions 并进行 24 个顺序查询吗?或者我应该使用索引并将查询拆分为 10 个查询,例如
网络几乎肯定是这里的瓶颈。 Oracle 并行性仅影响数据库检索数据的方式,但数据仍通过单线程发送到客户端。
假设单个线程尚未使您的网络饱和,您可能希望构建并发检索解决方案。这有助于 table 已经分区,然后您可以读取大块数据而无需重新读取任何内容。
我不确定如何在 Scala 中执行此操作,但您想 运行 同时进行多个这样的查询,以使用所有可能的客户端和网络资源:
select * from table partition (p1);
select * from table partition (p2);
...
不是真正的答案,但评论太长了。
太多变量会影响这一点,因此无法提供明智的建议,因此以下只是一些一般性提示。
这是通过网络还是本地服务器?如果数据库是远程服务器,那么您将付出沉重的网络代价。我建议(如果可能的话)运行使用 BEQUEATH 协议在服务器上提取数据以避免使用网络。文件完成后,与通过 JDBC 行处理将数据直接从数据库传输到本地文件相比,压缩和传输到目的地会更快。
使用 JDBC 记得设置游标提取大小以减少往返 - setFetchSize
。默认值很小(我认为是 10),试试 1000 之类的东西看看有什么帮助。
至于查询,您正在写入一个文件,因此即使 Oracle 可能会并行处理 查询 ,您的写入文件过程可能不会,所以这是一个瓶颈.
我的方法是编写 Java 程序以将一系列值作为命令行参数进行操作,并通过实验找出 Java 的哪个范围大小和并发实例可提供最佳性能.该范围可能属于离散分区,因此您将受益于分区 p运行ing(假设范围值是一个索引列,理想情况下是分区键)。
粗略地说,我将从 5m 的范围开始,运行 个与 CPU 核心数匹配的并发实例 - 2;这不是一个科学推导的数字,我倾向于将其用作我的第一次尝试,看看会发生什么。