我正在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错误.
尝试加快这一点时,有两件事需要考虑:
要走的路是使用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,只有一个执行此查询,而不是数千个.
| 归档时间: |
|
| 查看次数: |
3409 次 |
| 最近记录: |