2013-08-01 206 views
0

的SQL Server 2012(本地)到SQL Server 2005(投資相連)SQL更新和插入dupcliate表與鏈接服務器

我需要保持(鏈接)服務器同步,與本地服務器,其中包括約2-3表格(不是整個數據庫)。這不是真的時間敏感,所以我不想使用觸發器等。我們只是希望每天運行1-2次作爲計劃任務。

我曾嘗試:

DELETE FROM linked_server

INSERT INTO linked_server (值1,值2,值3) SELECT值1,值2,值3)FROM local_server

但是,這一過程正在像45分鐘加運行。我想更快地做一些事情 - 我已經搜索和搜索,但實際上找不到任何好的解決方案(這是我的理解水平)。

通常我們只談30個左右的記錄,或者更新或插入。

有任何建議。

+0

嗯,我不知道如何移動的30個記錄可能可能需要45分鐘 - 在此期間被東西堵住查詢? –

+0

我正在刪除linked_server表中的記錄,然後重新插入所有記錄......這是我想要避免的 - 需要更新或插入基於更改的記錄。 –

+0

我明白。這仍然不需要45分鐘(或者任何分鐘,就此而言)。 –

回答

0

對我來說,看起來關鍵是你不在乎數據的年齡(或者你想這樣做每天超過1-2次),但是你希望對那些是讀取數據。

現在,由於您將從2012年到2005年降低級別,因此一些明顯的選擇將會出現問題/不可能,例如複製。並且做某種MERGE操作(例如,使用ROWVERSION檢測兩個源之間的變化,如果您現在甚至有ROWVERSION列)仍然可能很麻煩,效率低下,並且可能會破壞試圖讀取另一端數據的用戶。

恕我直言,最簡單的方法是有一個表的影子副本...你截斷,填充所有的數據(無論需要多長時間 - 再次,這部分應該沒關係,因爲它發生在後臺),然後將其作爲元數據操作交換爲真正的表。基本上你有兩個額外的模式(shadowfake),在shadow模式中創建表格的相同副本,然後執行這樣的操作(最好是在2005服務器上運行並拉動,而不是推送表單2012,所以你不必擔心分佈式事務等):

TRUNCATE TABLE shadow.tablename; 

INSERT shadow.tablename([cols]) 
    SELECT [cols] FROM SQL2012.db.dbo.tablename; 

-- perhaps an explicit statistics update here 

BEGIN TRANSACTION; 

    -- this metadata operation is fast and it's the only 
    -- block/blockee in this operation. 
    ALTER SCHEMA fake TRANSFER  dbo.tablename; 
    ALTER SCHEMA dbo TRANSFER shadow.tablename; 

COMMIT TRANSACTION; 

ALTER SCHEMA shadow TRANSFER fake.tablename; 

(更妙的是具有對SQL Server 2012中端存儲過程,所以你可以INSERT...EXEC,並已超過隔離級別更多的控制權 - 例如將其設置爲RCSI或顫動NOLOCK。)

我的博客上講述這個位置:

http://www.sqlperformance.com/2012/08/t-sql-queries/t-sql-tuesday-schema-switch-a-roo

+1

我使用這個答案,因爲我們已經在做一些類似於陰影表的東西..但是一些信息你的博客給了我正在尋找的正確答案。謝謝! –

0

我猜測表格中的行數比您每天更新或插入的30條記錄更多。 如果您在源表中有一個時間戳/ rowversion列和一個主鍵,你可以在你的鏈接服務器保存的時間戳值,然後更新鏈接服務器中的所有值,其中

local.primary=linked.primary and local.timestamp!=linked.stamp 

,然後只插入新通過選擇鏈接服務器上不存在的主鍵來實現。