从链接服务器传输表数据的更快方法

时间:2010-03-16 17:23:52

标签: tsql sql-server-2008 postgresql linked-server

经过多次摆弄后,我设法安装了正确的ODBC驱动程序并在SQL Server 2008上成功创建了一个链接服务器,通过它我可以从SQL服务器访问我的PostgreSQL数据库。

我正在使用以下形式的合并语句将PgSQL DB中某些表的所有数据复制到SQL Server中:

with mbRemote as 
    (
        select 
            * 
        from 
            openquery(someLinkedDb,'select * from someTable')
    ) 
merge into someTable mbLocal 
using mbRemote on mbLocal.id=mbRemote.id
when matched 
        /*edit*/ 
        /*clause below really speeds things up when many rows are unchanged*/
        /*can you think of anything else?*/
        and not (mbLocal.field1=mbRemote.field1
                and mbLocal.field2=mbRemote.field2
                and mbLocal.field3=mbRemote.field3
                and mbLocal.field4=mbRemote.field4)
        /*end edit*/
        then 
        update
        set
                mbLocal.field1=mbRemote.field1,
                mbLocal.field2=mbRemote.field2,
                mbLocal.field3=mbRemote.field3,
                mbLocal.field4=mbRemote.field4
when not matched then 
        insert
        (
            id,
            field1,
            field2,
            field3,
            field4
        )
        values
        (
            mbRemote.id,
            mbRemote.field1,
            mbRemote.field2,
            mbRemote.field3,
            mbRemote.field4
        )
WHEN NOT MATCHED BY SOURCE then delete;

此语句完成后,本地(SQL Server)副本与远程(PgSQL服务器)完全同步。

关于这种方法的一些问题:

  1. 它是理智的吗?
  2. 让我感到震惊的是,更新将在本地行中所有未必更改的字段上运行。唯一的先决条件是本地和远程id字段匹配。是否有更细粒度的方法/约束合并语句的方法只更新实际更改的行?

1 个答案:

答案 0 :(得分:1)

如果您无法或不想使用像SSIS这样的工具,这看起来是一种合理的方法。

您可以检查匹配时的行,以检查是否发生了更改,例如:

when matched and mbLocal.field1 <> mbRemote.field1 then

如果您要检查多个列,这很多都很难处理,因此您可以添加一个检查列(例如LastUpdatedDate)以使其更容易。