检索并将百万条记录插入表中

时间:2016-06-24 07:05:22

标签: java performance sql-server-2008 jdbc pagination

我希望检索并插入另一个表的列 例如,下面是我想要检索值的第一个表

Table1 Records 1 ABC Singapore 2 DEF Vietnam

我从Table1中检索上面的列值,然后插入到另一个表中,如下所示

Table 2 ID Name Country 1 ABC Singapore 2 DEF Vietname

目前,我可以用java做,我首先检索记录然后拆分值并插入。但是,当Table1获取数百万条记录并将这些百万条记录插入Table2时,我希望通过批处理或分页来实现更好的性能。

任何指示我如何在我的情况下使用分页的指针将不胜感激。

我使用的是MSSQL 2008

1 个答案:

答案 0 :(得分:1)

如果需要在代码中执行此操作(而不是在SQL中,即使使用多个分隔符也应该更容易),您可能想要使用的是具有适当批量大小的批量插入您选择的优秀获取大小:

    //Prepare statements first
    try(PreparedStatement select = con.prepareStatement("SELECT * FROM SOURCE_TABLE");
            PreparedStatement insert = con.prepareStatement("INSERT INTO TARGET_TABLE(col1, col2, col3) VALUES (?,?,?)")) {

        //Define Parameters for SELECT
        select.setFetchDirection(ResultSet.FETCH_FORWARD);
        select.setFetchSize(10000);

        int rowCnt = 0;

        try(ResultSet rs = select.executeQuery()) {
            while(rs.next()) {
                String row = rs.getString(1);
                String[] split = row.split(" |\\$|\\*"); //However you want to do that
                //Todo: Error handling for array length

                //Todo: Type-Conversions, if target data is not a string type
                insert.setString(1, split[0]);
                insert.setString(2, split[1]);
                insert.setString(3, split[2]);
                insert.addBatch();

                //Submit insert in batches of a good size:
                if(++rowCnt % 10000 == 0) {
                    int[] success = insert.executeBatch();
                    //Todo: Check if that worked.
                }
            }
            //Handle remaining inserts
            int[] success = insert.executeBatch();
            //Todo: Check if that worked.               
        }

    } catch(SQLException e) {
        //Handle your Exceptions
    }

计算" good"获取和批量大小,您将要考虑一些参数:

  • Fetchsize会影响客户端的内存消耗。如果你有足够的,你可以把它变大。

  • 提交数百万行的插入需要一些时间。根据您的要求,您可能希望每隔一段时间提交一次插入事务(每250.000次插入?)

  • 考虑您的事务隔离:确保自动提交已关闭,因为提交每个插入将使大部分批处理收益消失。