优化在大循环中执行"选择"查询的速度

Wil*_*s C 7 java oracle jdbc

我正在Java循环中执行一个简单的"select"查询,如下所示.列表的大小可以增长到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....           
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:最后,有几种方法可以加快此查询速度.我正在使用第二种方式,因为它将来会阻止ORA-04031错误.

  1. 使用参数化的'SELECT'查询和'IN'子句.
  2. 创建一个嵌套表,并将来自JDBC的项目数组/列表转换为创建的嵌套表.
  3. 创建临时表并插入项列表.然后对主表执行JOIN(1个查询)并获得结果.

Rob*_*ijk 6

尝试加快这一点时,有两件事需要考虑:

  1. 对所有sheetid只执行一次此查询
  2. 通过不对代码值进行硬编码,确保每次都执行相同的查询.由于这些值可能会更改,因此每个查询将看起来像上一个查询,但只有几个不同的值.这将不允许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.
Run Code Online (Sandbox Code Playgroud)

创建SQL类型:

SQL> create type mynumbers is table of number;
  2  /

Type created.
Run Code Online (Sandbox Code Playgroud)

在您的代码中,使用"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.
Run Code Online (Sandbox Code Playgroud)

现在,共享池中只有一个SQL,只有一个执行此查询,而不是数千个.