2010-03-16 52 views
2

經過多次的調整之後,我設法安裝了正確的ODBC驅動程序,併成功在SQL Server 2008上創建了一個鏈接服務器,通過它我可以從SQL服務器訪問我的PostgreSQL數據庫。從鏈接服務器傳輸表數據的更快方法

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服務器:

我使用歸併採取以下形式的語句複製所有從一些在PGSQL數據庫中的表的數據到SQL Server )複製與遠程(PgSQL服務器)完全同步。

關於這種方法的幾個問題:

  1. 是理智?
  2. 它讓我感到更新將在本地行中的所有未必更改的字段上運行。唯一的先決條件是本地和遠程ID字段匹配。是否有更細粒度的方法/限制合併統計的方法,只更新實際上已更改的行?

回答

1

這看起來像一個合理的方法,如果你不能或想要使用像SSIS這樣的工具。

你可以在匹配時線檢查添加,以檢查是否發生了變化,是這樣的:

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

這多是笨拙的,如果你有超過兩列的多檢查,這樣你可以添加一個檢查列(例如LastUpdatedDate)以使這更容易。

+0

我試過了SSIS路由,但是它真的有x64 SqlServer和一個「實驗性」的x64 odbc驅動程序。這條路線確實是最後的選擇,但它堅如磐石,非常棒。我將在關於我的加速調整的主要問題中添加一些信息,這與您的建議相符。 – spender 2010-03-19 00:12:11

相關問題