如何通过java程序更快地选择和插入百万条记录

时间:2016-09-24 13:11:38

标签: java sql amazon-redshift

我正在尝试从redshift表中选择大约100万条记录,然后需要将这些记录插回到redshift表中(在进行一些操作之后)

但是,这需要很长时间。我等了大约1个小时让程序终止但没有运气。控制台似乎也不打印print statements,但在打印几个语句后似乎卡住了。

尝试了100条记录,它工作正常,大约需要2分钟。

这是我的代码的一部分:

        conn.setAutoCommit(false);
        stmt = conn.createStatement();
        stmt.setFetchSize(100);
        ResultSet rsSelect = stmt.executeQuery("select * from table");
        System.out.println("select done !");

        String queryInsert = "insert into table"
                +"(event_id,domain_userid,collector_tstamp,se_category,se_action,se_label,se_property)"
                +"values(?,?,?,?,?,?,?)";

        PreparedStatement preparedStatement = conn.prepareStatement(queryInsert);
        final int batchSize = 10000;
        int count = 0;
        System.out.println("about to go into loop !");


        while(rsSelect.next()){

            String event_id = rsSelect.getString("event_id");
            String domain_userid = rsSelect.getString("domain_userid");
            Timestamp collector_tstamp = rsSelect.getTimestamp("collector_tstamp");
            String se_category = rsSelect.getString("se_category");
            String se_action = rsSelect.getString("se_action");
            String se_label = rsSelect.getString("se_label");
            String se_property = rsSelect.getString("se_property");

            //some manipulations

            preparedStatement.setString(1, event_id);
            preparedStatement.setString(2, domain_userid);
            preparedStatement.setTimestamp(3, collector_tstamp);
            preparedStatement.setString(4, se_category);
            preparedStatement.setString(5, se_action);
            preparedStatement.setString(6, se_label);                        
            preparedStatement.setString(7, se_property);
            preparedStatement.addBatch(); 

            if(++count % batchSize == 0){
                preparedStatement.executeBatch();
                System.out.println("batch execution!");

            }               
        }
        System.out.println("out of loop");
        preparedStatement.executeBatch();
        preparedStatement.close();
        conn.commit();
        conn.close();   

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,将数据从一个红移表插入另一个红移表(我使用了node.js)花了太长时间。最初我花了大约18分钟来插入100万条记录
我认为我的表中的数据没有根据排序键(时间戳)进行排序。必须根据排序键对数据进行排序,并在where谓词中使用该排序键(如果您有where谓词)。
Run vacuum table to 100 percent
对数据进行排序。操作完成后,请确保根据您的排序键按数据排序。

在这之后,我能够取得意想不到的结果。在3秒内录制100万条记录。