将大数据迁移到新数据库

时间:2017-08-15 08:05:30

标签: c# sql-server cursor

我想使用我在C#中编写的解决方案将大量数据从SQL Server传输到MongoDB(大约8000万条记录)。 我想一次转移说200 000条记录,但我的问题是跟踪已经转移的内容。通常我会这样做:

Gather IDs from destination to exclude from source scope
Read from source (Excluding IDs already in destination)
Write to destination
Repeat

问题是我在C#中构建了一个字符串,其中包含目标中存在的所有ID,目的是从源选择中排除这些ID,例如。

select * from source_table where id not in (<My large list of IDs>)

现在你可以想象当我已经插入了60万条以上的记录然后构建一个包含所有ID的字符串时会发生什么,它会变大并且会减慢速度,所以我正在寻找一种迭代方法一次说20万条记录,就像光标一样,但我从未做过这样的事情,所以我在这里寻找建议。

作为参考,我按以下方式阅读

    SqlConnection conn = new SqlConnection(myConnStr);
    conn.Open();
    SqlCommand cmd = new SqlCommand("select * from mytable where id not in ("+bigListOfIDs+")", conn);
    SqlDataReader reader = cmd.ExecuteReader();
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            //Populate objects for insertion into MongoDB
        }
    }

基本上,我想知道如何迭代大量数据而不必一次选择所有数据,或者必须使用大字符串过滤数据。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

需要更多代表评论,但如果您按id列排序,则可以将where子句更改为

select * from source_table where *lastusedid* < id and id <= *lastusedid+200000*

这将为您提供所要求的200000范围,您只需要存储单个整数

答案 1 :(得分:0)

有很多不同的方法可以做到这一点,但我首先建议你不要试图重新发明轮子,但要看现有的程序。 有许多程序用于在不同数据库之间导出和导入数据,有些程序非常灵活且昂贵,但其他程序提供免费选项,大多数DBMS程序都包含一些内容。

选项1:

使用SQL Server Management Studio(SSMS)导出向导。

这允许您导出到不同的来源。如果需要,您甚至可以编写复杂的查询。更多信息:

https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/

选项2:

按升序ID顺序导出数据。 将最后导出的ID存储在表格中。

导出下一组数据,其中ID&gt; lastExportedID

选项3:

在备份表中创建数据副本。 从此表导出,并在导出时删除记录。