代码之家  ›  专栏  ›  技术社区  ›  Punter Vicky

使用并行处理加速select查询

  •  0
  • Punter Vicky  · 技术社区  · 8 年前

    我正在运行一个简单的select查询,从表中获取所有值,并使用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分钟内用一张表中的800K记录创建一个文件。这似乎比上面列出的代码要快得多,它花了30多分钟才完成。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Saxon    8 年前

    我认为使用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