当前位置: 首页 > 知识库问答 >
问题:

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

宗冷勋
2023-03-14

有一列我想检索并插入到另一个表中例如,下面是我想检索值的第一个表

我使用MSSQL2008

共有1个答案

吕灿
2023-03-14

如果您需要在代码中(而不是在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
    }

在计算“好的”提取和批处理大小时,您需要考虑一些参数:

>

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

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

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

  •  类似资料:
    • 问题内容: 有一个数据库,它在一个表中大约包含200万条记录。我从我的Java代码中运行查询,例如“ select * from table”。是否将从结果集中的数据库中获取完整数据。或不 。如果是,那么它将如何工作,我想学习此检索工作, 请让我知道,我在某处了解到它将从数据库中检索完整的数据并将其存储在临时存储中,并在输出中显示出来。还是与J2C有关 问题答案: 它会从结果集中的数据库中获取完整

    • 我构建了一个由九个节点组成的hbase集群。每个节点都有64GB的内存容量。现在,我想向hbase插入数百万条记录。为了提高写入性能,我在每个节点中创建了20个线程,并且在每个节点中将writebuffer设置为64MB,并且自动刷新为false。 准备好数据并设置好配置后,我启动hbase集群。但当记录达到一定程度时,问题就出现了。 Java语言网SocketTimeoutException:等

    • 我有一个“Customer”表,它有将近120万条记录,其中一列是ntext类型的“customer_records ”,它包含xml数据。我需要在该列的所有现有记录中替换一个url值。我尝试了下面的替换查询,但是执行该查询需要大约20分钟的时间。 在更新期间,CPU 消耗被利用到最大,这引起了问题。在 120 万条记录中,实际更新的记录中有 60 万条记录,但查询需要读取每条记录以查找和替换 U

    • 问题内容: 我正在使用Laravel 4,我需要在MySQL表中插入一些行,并且需要找回插入的ID。 对于单行,我可以使用,但是它不支持多行。如果我至少能像普通的MySQL一样检索第一行的ID,就足以找出其他的ID。 问题答案: 根据用户Xrymz的建议,返回第一个。 根据Schemaapi 接受数组 所以你必须能够 就是说,如果使用MySQL,则可以由此检索第一个ID并计算其余的ID。还有一个功

    • 问题内容: 我有以下用C#编写的代码,但是据此,我需要4-5天的时间才能将数据从Oracle数据库迁移到Elasticsearch。我将以100批为单位插入记录。是否还有其他方法可以使400万条记录的迁移速度更快(如果可能的话,可能不到一天)? 问题答案: 该功能将对性能产生负面影响,并且您正在运行数千次。您已经在使用-它不会一次将所有四百万行都拉到您的计算机上,它基本上是一次流一次或几行。 这必

    • 我有一个查询,它从另一个表中填充表数据。现在它看起来像这样。 在10 000条记录上,它执行大约10秒。但是会有10,000,000条记录的情况,恐怕它会很慢。我能做得更快吗?