使用并行处理加速选择查询



我正在运行一个简单的选择查询来从表中获取所有值,并使用Java代码将结果集写入CSV文件。以下代码-

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
info.setProperty("user", "<username>"); //x_sbe_read
info.setProperty("password", "<password>");
Connection conn = DriverManager.getConnection("<burl>", info); 
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("select '/*+ PARALLEL(t,10) */' from <tablename> t");
File resultFile = new File("/tmp/data.csv");
CSVWriter csvWriter = new CSVWriter(new FileWriter(resultFile), CEDILLA_CHAR, Character.MIN_VALUE, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
csvWriter.writeAll(rset, false);
csvWriter.close();
rset.close();
stmt.close();
conn.close();

此表包含过去3年的数据。我想加快进程的方法之一是运行一个单独的线程,从而旋转36个线程,每个线程查询1个月的数据(在确保数据库可以处理36个连接之后(,并将结果聚合到一个文件中。

java或oracle函数中是否有任何库可以通过并行查询数据和聚合结果集来帮助实现这一点。

编辑:

我使用Pentaho,它能够在我的笔记本电脑上用13分钟的时间在一张表中创建一个包含800K条记录的文件。这似乎比上面列出的代码快得多,上面列出的程序花了30多分钟才完成。

我认为使用java是个坏主意。也许您可以从java进行系统调用,以执行执行以下任务的sql会话:

set term off
set feed off
set sqlformat csv
spool tablename_output.csv
select /*+ parallel */ * from <tablename>;
spool off

否则:

set term off
set feed off
spool tablename_output.csv
select /*+ parallel */ field1 || ';' || field2... from <tablename>;
spool off

最新更新