将大数据迁移到新数据库
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 导出,并在导出时删除记录。
我想使用我用 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 导出,并在导出时删除记录。