如何有效地将我的数据与远程数据库进行比较?

时间:2010-02-05 15:30:13

标签: sql sql-server optimization

我需要使用远程数据库(也是SQL Server,在同一本地网络上的不同服务器上)中的更改来更新SQL Server中的联系人数据库。我无法对远程数据库进行任何更改,这是一种商业产品。我使用链接服务器连接到远程数据库。两个表都包含大约200K行。

此时我的逻辑很简单:[简化的伪SQL跟随]

/* Get IDs of new contacts into local temp table */

Select remote.ID into #NewContactIDs
From Remote.Contacts remote
Left Join Local.Contacts local on remote.ID=local.ID
Where local.ID is null

/* Get IDs of changed contacts */

Select remote.ID into #ChangedContactIDs
From Remote.Contacts remote
Join Local.Contacts local on remote.ID=local.ID
Where local.ModifyDate < remote.ModifyDate

/* Pull down all new or changed contacts */

Select ID, FirstName, LastName, Email, ...
Into #NewOrChangedContacts
From Remote.Contacts remote
Where remote.ID in (
        Select ID from #NewContactIDs 
        union 
        Select ID from #ChangedContactIDs
    )

当然,通过电线进行这些连接和比较正在扼杀我。我确定有更好的方法 - 建议吗?

2 个答案:

答案 0 :(得分:3)

考虑在本地系统中维护lastCompareTimestamp(上次进行比较)。使用ModifyDates&gt;抓取所有远程记录lastCmpareTimestamp并将它们放在本地临时表中。与他们在当地合作。

答案 1 :(得分:0)

最后一个比较日期是个好主意

另一种我取得了巨大成功的方法是SSIS(虽然它有一个学习曲线,除非你经常做这类事情,否则可能有点过分了):

制作包

为两个表中的每个表设置数据源。如果你期望很多变化拉动整个表格,如果你只想要增量变化,那么按模式日期过滤。确保结果已订购

漏斗两者都设置为完全外部联接

将联接的结果拆分为三个桶:未更改,已更改,新

丢弃未更改的记录,将新记录发送到插入目标,并将更改的记录发送到基于SQL的更新的临时表,或者 - 对于少数行 - 发送带有参数化更新语句的OLEDB命令。 / p>

OR,如果在SQL Server 2008上,请使用Merge