代码执行时间非常长

时间:2018-06-17 05:43:27

标签: java sql oracle11g

我试图将数据从一个表移动到另一个表(两个表基本相同),我使用的方法是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等基本权限。

2 个答案:

答案 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以查看时间在哪里丢失。