我正在Java循环中执行一个简单的“选择”查询,如下所示。列表的大小可以增长到10000+。如何提高查询速度?任何示例或建议,不胜感激。谢谢。

请注意,我需要检索该表的每一列中的所有数据,因此才使用星号(*)。

List<String> valueList = ....
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    conn = DriverManager.getConnection(dbURL, dbUsername, dbPassword);
    for (int m = 0; m < valueList.size() ; m++) {
         String sql = "SELECT * FROM WORKSHEET WHERE " + sheetId + " = '" +
                      valueList.get(m) + "'";
         ps = conn.prepareStatement(sql);
         rs = ps.executeQuery();
         // retreive data....
    }
}

编辑:最后,有几种方法可以加快此查询的速度。我正在使用第二种方法,因为它可以防止将来发生ORA-04031错误。
  • 将参数化的“SELECT”查询与“IN”子句一起使用。
  • 创建一个嵌套表,并将来自JDBC的项目的数组/列表强制转换为创建的嵌套表。
  • 创建一个临时表并插入项目列表。然后对主表执行JOIN(1个查询)并获得结果。
  • 最佳答案

    在尝试加快速度时,有两件事需要考虑:

  • 对所有 sheetid 的
  • 只执行一次此查询
  • 确保每次都执行相同的查询,而不是对其中的值进行硬编码。
    由于这些值可能会更改,因此每个查询都将与前一个查询类似,但只有几个不同的值。这将不允许 Oracle 重用以前的查询并导致共享池中的 SQL 不可共享。这将填满共享池。这样做足够长时间,您将收到 ORA-04031 错误消息。

  • 要走的路是使用 SQL 类型。这是 PL/SQL 中的示例。您可以在 Java 中使用相同的原理。

    首先创建一个包含一万个 sheetId 的表:
    SQL> create table worksheet (sheetid)
      2  as
      3   select level
      4     from dual
      5  connect by level <= 10000
      6  /
    
    Table created.
    

    创建一个 SQL 类型:
    SQL> create type mynumbers is table of number;
      2  /
    
    Type created.
    

    在您的代码中,使用“valuelist”中的值填充 SQL 类型的实例,并使用 TABLE 运算符将类型转换为表值:
    SQL> declare
      2    valuelist mynumbers := mynumbers(23,124,987,6123,8923,1,7139);
      3  begin
      4    for r in
      5    ( select ws.sheetid
      6        from worksheet ws
      7           , table(valuelist) vl
      8       where ws.sheetid = vl.column_value
      9    )
     10    loop
     11      dbms_output.put_line(r.sheetid);
     12    end loop;
     13  end;
     14  /
    1
    23
    124
    987
    6123
    7139
    8923
    
    PL/SQL procedure successfully completed.
    

    现在,您的共享池中只有一个 SQL,并且该查询只有一个执行,而不是数千个。

    关于java - 在大循环中优化执行 "select"查询的速度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6584966/

    10-11 02:57
    查看更多