【发布时间】:2012-05-31 06:36:56
【问题描述】:
我想优化这个 SQL 查询的性能。如果我用一百万个键填充这个哈希表,查询将需要大约一分钟。如何优化此 Java 方法以加快执行速度?
private HashMap<String, Boolean> selectedIds = new HashMap<>();
public void deleteSelectedIDs() throws SQLException {
if (ds == null) {
throw new SQLException();
}
Connection conn = ds.getConnection();
if (conn == null) {
throw new SQLException();
}
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
conn.setAutoCommit(false);
boolean committed = false;
try {
String sqlDeleteQuery = "DELETE FROM ACTIVESESSIONSLOG WHERE ASESSIONID = ?";
Set<String> keySet = selectedIds.keySet();
String[] keys = new String[]{};
keys = selectedIds.keySet().toArray(keys);
ps = conn.prepareStatement(sqlDeleteQuery);
for (int i = 0; i < keys.length; i++) {
if (selectedIds.get(keys[i]).booleanValue()) {
ps.setString(1, keys[i]);
ps.executeUpdate();
ps.clearParameters();
selectedIds.put(keys[i], false); //get(keys[i]) = false;
}
}
conn.commit();
committed = true;
//selectedIds.clear();
} finally {
if (!committed) {
conn.rollback();
}
}
} finally {
ps.close();
conn.close();
}
}
【问题讨论】:
-
您要优化 SQL 语句还是 Java 程序?如果是 SQL 查询,你怎么知道它是慢的部分?你计时了吗?如果有,执行计划是什么?
-
我要优化一切。
-
您需要在 Java 中获取 ID 吗?你能在 SQL 中计算一组 ID 并在那里进行完整的操作吗?一分钟内一百万次 SQL 往返已经相当不错了!否则,您可以尝试使用
WHERE ASESSIONID IN (?,?,..等将 ID 批处理为每个 SQL 语句 50 个。 -
首先,您可以遍历
selectedIds.entrySet(),而不是将键转换为数组,然后随时查找每个键。但坦率地说,Java 不是问题:它是您生成 SQL 和/或首先将所有 ID 提取到 Java 中的方法,而您可以在数据库中完成所有这些操作。
标签: java sql oracle optimization