将大数据迁移到新数据库

Migrating big data to new database

我想使用我用 C# 编写的解决方案将大量数据从 SQL 服务器传输到 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>)

现在你可以想象当我已经插入 600 000 多条记录然后构建一个包含所有 ID 的字符串时会发生什么,它变得很大并且速度更慢,所以我正在寻找一种方法来一次遍历 200 000 条记录,就像游标一样,但我从来没有做过这样的事情,所以我在这里寻求建议。

仅供参考,本人解读如下

    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
        }
    }

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

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

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

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

有很多不同的方法可以做到这一点,但我首先建议您不要尝试重新发明轮子,而是看看现有的程序。 有许多设计用于在不同数据库之间导出和导入数据的程序,有些非常灵活但价格昂贵,但有些则提供免费选项,而且大多数 DBMS 程序都包含一些东西。

选项 1:

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

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

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

选项 2:

按 ID 升序导出数据。 将最后导出的 ID 存储在 table.

导出下一组数据where ID > lastExportedID

选项 3:

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