2013-05-20 42 views
3

我有一个数据库服务器,充当主SQL Server,包含一个表来保存所有数据。其他数据库服务器进出(SQL Server的不同实例)。当他们联机时,他们需要从主表下载数据(在给定的时间段内),然后他们将自己的附加数据生成到同一本地SQL Server数据库表中,然后希望仅用新数据更新主服务器,使用C#程序,通过定期服务,每隔一段时间。多个额外的服务器可能同时生成数据,虽然它不会那么多。从一个SQL Server到另一个表的高效更新表,结构

主表将始终在线。额外的非主数据库表并不总是在线的,并且不应该是主副本,首先它将包含主数据的子集,然后它自己产生附加数据到本地表并更新主表往往与其更新。可能有相当数量的生成和/或下载的行数。所以需要一个高效的算法从额外的数据库复制到主表。

什么是最有效的方式在C#中传输这个? SqlBulkCopy看起来不像它会起作用,因为我不能在主服务器中有重复的条目,并且如果由于某些条目已经存在而检查约束条件,它会失败。

+1

我不把它放在答案上,因为它不在C#中。如果你真的关心性能,我认为最有效的方法是通过数据库镜像。 – Renan

+0

一种可能性是做部分事务复制(http://stackoverflow.com/questions/495680/sql-server-transactional-replication-partial-data-only)。或者只是创建一个应用程序,完全为你维护这个任务。 – mipe34

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

0

以下是如何我会做到这一点:

  1. 其接收具有相同的结构作为主表中的用户定义的表的变量主表数据库上创建的存储过程。

应该做这样的事情 -

INSERT INTO yourtable (SELECT * FROM tablevar) 

,或者你可以使用MERGE语句插入,或更新功能。

  1. 在代码中,(一个窗口服务)负载的所有(或一部分)从secondery表中的数据并将其发送到存储过程作为表的变量。

  2. 您可以以1000的批量执行此操作,并且每次批量更新时都应将其标记在源表/源更新程序代码中。

+0

您无法将公用表表达式作为变量存储在存储过程中。你的意思是用户定义的表变量? –

+0

是的,对不起。我正在更新我的答案。 –

1

你可以在DB或C#中做到这一点。在所有情况下,您都必须执行类似Using FULL JOINs to Compare Datasets的操作。你已经知道了。

最重要的是在交易中做到这一点。如果您有100k行,则将其分割为每个事务1000行。或者尝试确定每笔交易的行数最适合您。使用Dapper。这真的很快。

如果您拥有C#中的所有数据,请使用TVP将它传递给DB存储过程。在存储过程中使用MERGEUPDATE/DELETE/INSERT数据。

最后。在C#中使用Dictionary<Tkey, TValue>或与O(1)不同的访问时间。

0

SQLBulkCopy是从C#程序中将数据插入表中的最快方法。我用它来在数据库之间复制数据,迄今为止没有任何东西能够在速度上胜出。这是一个很好的通用示例:Generic bulk copy

当您下载数据到本地数据库服务器,我会用一个IsProcessed标志在主服务器和主表的主键的跟踪表。然后,您应该可以再次对主服务器进行删除和更新。

0

你可以使用链接服务器吗?如果是的话,它会使从主服务器到主服务器的数据复制变得更容易。

在将数据复制回主服务器时,我会在每个INSERT语句之前使用IF EXISTS来额外确保没有重复项并将所有插入语句封装到事务中,以便在发生错误时回退事务。

我也同意其他人对1000条左右的记录进行分批处理,以便在出现问题时可以限制损坏。

相关问题