2013-01-16 37 views
0

我有一個相當複雜的情況,其中可以並行運行相同的程序包。在某些情況下,兩種執行都可能最終嘗試將同一行插入到目標中,這會導致主鍵錯誤的違反。ole db目的地上的重複行

目前有一個查找檢查目標表以查看存在的記錄,以便插入在其「不匹配」輸出上完成。它不會阻止錯誤,因爲查找會加載到程序包啓動上,因此兩個程序包都會在其上獲取相同的數據,如果兩行中都有行,則會將其視爲「新」行,以便第一個成功,第二個成功。

任何可以避免這種情況的方法?幾乎忽略oledb目的地的「重複行」?我不能使用最大錯誤計數,因爲重複的行在其他行中不在第一個包上並且應該插入。

+0

這是Access數據庫還是Exel電子表格? – Derek

+0

sql server源和目的地 – Diego

+0

你可以不插入PK嗎? – Bulat

回答

2

默認查找行爲是採用全高速緩存模式。正如您所看到的,在包驗證階段,它會將所有查找值都拉到本地內存緩存中,並使用它導致缺少對錶的更新。

對於您的情況,我會嘗試將緩存模式更改爲None(部分是其他選項)。 「無」表示實際查詢應該針對經過的每一行觸發到目標數據庫。根據您的數據量或性能不佳的查詢,這可能會對目標產生不小的影響。它仍然不能保證並行實例不會嘗試加載完全相同的記錄(或者並行運行已經滿足其查找並且已準備好寫入目標表),但它應該改善情況。

如果你不能控制包執行,以便併發數據流被觸發,那麼你應該考慮重新設計方法(寫入分區和交換,使用某些東西來鎖定資源,暫存所有數據並使用TSQL合併等)

+0

感謝人,想到這一點,但我應該提到,有問題的數據集可能包含超過1M行,所以部分緩存不是一個選項。要做到最差,它們的值非常稀疏,所以即使不匹配緩存百分比也不會在數據庫中避免1M選擇 – Diego

0

只是一個想法...如何將新記錄寫入臨時表併合並它間歇?這將有機會過濾出重複。