我正在运行一个简单的选择查询,以从表中获取所有值,然后使用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个月的数据(确保db可以处理36个连接后)并将结果汇总到单个文件中
java或oracle函数中是否有任何库可以通过并行查询数据并汇总结果集来帮助实现相同功能。
编辑:
我使用了Pentaho,它能够在13分钟内在笔记本电脑上的80万条记录中创建一个文件。这似乎比上面列出的代码花费了30多分钟且没有完成的速度快得多。
答案 0 :(得分:1)
我认为使用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