我试图将数据从一个表移动到另一个表(两个表基本相同),我使用的方法是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开发人员中执行它的速度非常快,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命令无法解决,我想改变数据库方面的思维方式。
有谁能告诉我在11g上执行INSERT-SELECT
SQL命令时我需要什么样的权限?因为我可以看到这个命令只需要执行SELECT/INSERT/UPDATE/DELETE
等基本权限。
答案 0 :(得分:0)
整个插入过程的时间取决于三个因素:
Request_Log.transaction_date
上的索引Request_History
表)中是否有任何约束和索引需要维护检查语句的执行计划,看是否有什么-最糟糕的是全表扫描。如果允许,您也可以在此处粘贴执行计划。
答案 1 :(得分:0)
打开连接的方式可能有问题,会话参数也有问题。您可能没有足够的撤消空间或其他限制因素。通过Java与SQL Developer执行此操作时,也许可以让dba对其进行检查。
您修改
create table Request_History_test
as SELECT
customer_id, request_id, status, transaction_date, current_timestamp
from
Request_Log
where
transaction_date <= (sysdate - NUMTODSINTERVAL(:1 ,'DAY'))
如果这与您的“插入选择”相比快速进行,请与您的DBA联系。您的撤消空间/重做日志可能存在已知问题。我不是DBA,所以这个答案很模糊,我曾经有过类似的问题。
哦,请检查您的dba_hist_sqlstat以查看时间在哪里丢失。