merge 語句實現數據的差異傳輸

最近數據庫升級到2008,研究了一下,發現有一個很好用的新功能,merge 語句加上存儲過程,可以實現數據的差異傳輸,源表的增刪改,都可以使用 merge 語句,把數據更改應用到目標表上,我們原來一個2億多條記錄的表,完全傳輸一次需要3個多小時,使用這個方法進行數據傳輸,首次花的時間和原來差不多,但是在以後的定時作業裏面,看到傳輸時間只有不到 10分鐘了,經大量數據抽樣檢查,數據是完全相同的,通過優化,以及增加作業的頻率,可以實現數據更短的時間差,這對於表比較大,而且需要進行不定期同步的情況來說,節省了不少時間,當然,數據庫鏡像 和 數據發佈訂閱也能解決這個問題,但是對應用比較簡單,數據同步實時性要求不高,數據量巨大的情況,這個方法部署起來還是相對簡單一些的,呵呵

這個方法非常實用,但是還存在一些侷限性,要根據每個表的不同,需要單獨建立存儲過程,這點比較繁複,有沒有更好的方法,能使用在所有的表上呢??

 

先把單獨一個表的情況,發出來讓大家分享一下,歡迎各位大俠提出更好的解決辦法,能夠實現多表通用


1:先在目標服務器上建立一個到源服務器的鏈接服務器,名字 xx2008(比較簡單,不詳細說了)

2:在表裏面,增加一個字段 updatetime,記錄數據更新時間,同時表裏面要有 id 自動增加字段

3:以原庫名 c_001 , t_001 表爲例,以在目標服務器上建立存儲過程(以下是例程,要提高效率的話,還可以優化過程)

4:建立作業,定時調用存儲過程

 

Create PROCEDURE [dbo].[backup_001]

AS
BEGIN

   
SET NOCOUNT ON;    SET IDENTITY_Insert t_001 ON
    merge t_001 d
    using
    (
SELECT * FROM OPENQUERY (xx2008 ,'select * from c_001.dbo.t_001' )  ) s
   
on (d.id=s.id and d.updatetime<>s.updatetime)
   
WHEN NOT MATCHED BY SOURCE THEN    delete
   
when matched then
       
update set
        d.f1
=s.f1,
        d.f2
=s.f2,
        d.f3
=s.f3,
        ......
        d.updatetime
=s.updatetime
   
when not matched then
       
insert (d.f1,d.f2,d.f3,......d.updatetime)
       
values (s.f1,s.f2,s.f3,......s.updatetime);
   
SET IDENTITY_Insert t_001 OFF
   

   

END

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章