【发布时间】:2011-07-05 15:13:04
【问题描述】:
我正在 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 错误。
- 使用带有“IN”子句的参数化“SELECT”查询。
- 创建一个嵌套表并将来自 JDBC 的项的数组/列表转换为创建的嵌套表。
- 创建一个临时表并插入项目列表。然后对主表执行 JOIN(1 个查询)并获取结果。
【问题讨论】:
-
SQL Injection Hooooorrrrraaay! 旁注:使用参数化查询也会给你带来更好的性能。
-
您已经给出了 * 的原因 - 您没有使用参数化查询的任何原因?
-
通过在每个查询中检索多个 sheetID/m 对来减少执行的查询总数 (
WHERE pair1 or pair2 or pair3 etc...) 将减少一些开销。 -
@Bobby:由于我正在构建的是一个 Java 程序,它不需要用户的任何输入,因此 SQL 注入问题不会困扰我。
-
@Jon Skeet:我已经通过实现参数化查询测试了该程序。好像查询速度差不多。