我正在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错误。
最佳答案
在尝试加快速度时,有两件事需要考虑:
由于这些值可能会更改,因此每个查询都将与前一个查询类似,但只有几个不同的值。这将不允许 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/