2010-03-17 252 views
0

批量更新這是我們的使命:SSIS - 在數據庫字段級

  • 來自客戶端的接收文件。每個文件包含1到1,000,000條記錄。
  • 將記錄加載到暫存區域並應用業務規則驗證。然後
  • 有效記錄進行抽成批處理方式OLTP數據庫,下列規則:
    • 如果記錄不存在(我們有一個關鍵,所以這不是一個問題),創建它。
    • 如果存在記錄,可選擇更新每個數據庫字段。這個決定是基於三個因素中的一個來做出的......我不相信這些因素是重要的。

我們的主要問題是找到的任選在字段級別更新數據的有效方法。這適用於大約12個不同的數據庫表,每個表中有10到150個字段(原始數據庫設計還有很多不足之處,但它就是這樣)。

我們的第一次嘗試是引入一個鏡像臨時環境(每個系統字段的臨時區域中的1個字段)幷包含掩碼標誌的表。掩蔽標誌的值代表3個因素。

我們然後把類似於UPDATE ...

UPDATE OLTPTable1 SET Field1 = CASE 
    WHEN Mask.Field1 = 0 THEN Staging.Field1 
    WHEN Mask.Field1 = 1 THEN COALESCE(Staging.Field1 , OLTPTable1.Field1) 
    WHEN Mask.Field1 = 2 THEN COALESCE(OLTPTable1.Field1 , Staging.Field1) 
... 

正如你可以想像,性能是相當可怕的。

有沒有人處理過類似的需求?

我們是一家MS店,使用Windows服務啓動處理數據處理的SSIS包。不幸的是,我們在這方面非常新手。

回答

0

如果您使用的是SQL Server 2008,請查看MERGE語句,這可能適合您在此處的Upsert需求。

您可以使用條件拆分來將輸入發送到不同的處理階段,具體取決於匹配的因素嗎?聽起來你可能需要爲12個表中的每一個表做這件事,但可能你可以同時做一些。

0

我看了一下合併工具,但我不確定它能否靈活地根據預定義的規則指示哪個數據源優先。

此功能對於允許多個成員利用具有非常不同需求的過程的系統至關重要。

從我讀過的合併函數更多的是一個排序的聯合。

0

我們確實使用類似於您在我們產品中描述的用於外部系統輸入的方法。 (我們可以處理多達200個目標表,最多240列)就像你所描述的那樣,有一百萬到一百萬或更多的行。

通常,我們不嘗試設置單個批量更新,我們試圖一次處理一列的值。鑑於它們都是代表相同數據元素的單一類型,所以暫存UPDATE語句很簡單。我們一般創建臨時表的映射值,這是一個簡單的

UPDATE target SET target.column = mapping.resultcolumn WHERE target.sourcecolumn = mapping.sourcecolumn.

建立的映射是有點棘手,但我們再一次與一列處理,而這樣做。

我不知道你是如何定義'可怕的'。對我們來說,這個過程是在批處理模式下完成的,通常在一夜之間完成,所以絕對性能幾乎不是問題。

編輯: 我們還做這些可配置大小的批次,因此工作組&提交將被永遠不會很大。我們的默認值是批次中的1000行,但是一些特定的情況已經從多達40,000個批次中受益。我們還爲特定表格的工作數據添加索引。