我正在尝试将数据从一个表移动到另一个表(两个表基本相同),我使用的方法是INSERT-SELECT
。
我面临的问题是我的java程序似乎被卡住在那里,但我仍然可以轻松地用^C
强行关闭它,所以我认为它可能仍然存在,但由于某种原因卡住了。
这是我的代码,陷入了这个问题
public String moveData(String sql, int day) {
Connection con = null;
PreparedStatement stmt = null;
int count;
try {
con = DriverManager.getConnection(DSN, Username, Password);
stmt = con.prepareStatement(sql);
stmt.setInt(1, day);
count = stmt.executeUpdate();
return String.valueOf(count);
} catch (SQLException e) {
System.out.println("SQL exception: " + e.getMessage());
e.printStackTrace();
return "false";
} finally {
try {
stmt.close();
} catch (Exception e) {
}
try {
con.close();
} catch (Exception e) {
}
}
}
还有 SQL,在 SQL Developer 中执行速度非常快,23k 行数据只需 0.231 秒
insert into Request_History (customer_id, request_id, status, transaction_date, last_modified)
SELECT customer_id, request_id, status, transaction_date, current_timestamp
from Request_Log
where transaction_date <= (sysdate - NUMTODSINTERVAL(:1 ,'DAY'))
我发现它们没有问题,有什么我错过的吗?
更新
由于程序和SQL命令没有解决,所以我想改变DB端的思维方式。
谁能告诉我需要什么样的权限才能在 11g 上毫无问题地执行 INSERT-SELECT
SQL 命令?因为据我所知,该命令只需要基本权限,例如 SELECT/INSERT/UPDATE/DELETE 即可执行。
最佳答案
整个插入过程的时间取决于三个因素:
- 查询结果集中有多少行
- 是否有可在查询级别使用的索引(最好是在
Request_Log.transaction_date
上建立索引 - 插入阶段是否有任何必须维护的约束和索引(
Request_History
表)
检查语句的执行计划,看看是否有任何东西 - 最糟糕的是全表扫描。如果您允许,您也可以将执行计划粘贴到此处。
关于java - 代码执行时间非常长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50894028/