我想使用我在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
}
}
基本上,我想知道如何迭代大量数据而不必一次选择所有数据,或者必须使用大字符串过滤数据。任何帮助将不胜感激。
答案 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:
在备份表中创建数据副本。 从此表导出,并在导出时删除记录。