java - 代码执行时间非常长

标签 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 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/

相关文章:

java - long 和 double 赋值不是原子的——这有什么关系?

java - 从 Java 反编译 ANTLR

java - java中Exec方法从未抛出异常

用于查找数据匹配或实体解析误报的 SQL 查询

带有 tomcat 和 eclipse 的 Java RESTful Web 服务给出 404

sql - 根据最大列值对唯一行进行分组

php - 根据另一个数组从数组中删除行

sql - 使用 PL/SQL 解析 XML 时跳过重复值

java - Oracle 截断日期的时间部分

java - 如何将模式名称添加到 Spring Data JPA 中的查询注释