2017-08-15 48 views
2

我想使用我在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字符串。

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

所以基本上,我想知道如何通过大量数据的迭代,而不选择在一个全力以赴的数据,或有过滤数据使用大字符串。任何帮助,将不胜感激。

回答

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

方案3:

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

+0

我希望有一些方法可以通过一些类似游标的方法或异步方法一次遍历N个记录,但经过大量的搜索后,我空手而出。我必须解决将最后使用的ID存储在单独的表中的方法。谢谢你的帮助。 – Anomaly

1

需要更多的代表发表意见,但如果你按你的id列,你可以改变你的where子句成为

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

,这将给你20万,你问的范围内,你只需要存储单个整数