2013-08-16 42 views
0

這是在ssis中實現不同操作的最佳選擇? 我有一個超過200列的表格,包含超過1000萬行。 我需要從這個表中獲得雙向行。是明智的使用執行sql任務(與選擇查詢重複刪除行)還是有任何其他方式來實現這一點在ssis如何在10億行表中執行重複數據刪除ssis

我明白, ssis排序組件重複刪除行...但這是一個阻塞組件,它不是一個好主意,請使用...請讓我知道你對此的看法

+1

正是爲什麼分類元件是不是有用?據我所知,這是唯一可以讓你區分重複的轉變。或者你可以使用類似SQL的命令。 – DNac

+0

您是否嘗試檢索不同的行或從原始表中刪除重複項? –

+0

排序組件排序之前,它執行重複數據刪除..所以我的問題是是否使用排序或使用sql。哪一個更好 – user1254579

回答

0

由於寫據我所知,排序組件是唯一允許你區分重複的轉換。或者你可以使用類似SQL的命令。
如果排序操作有問題,那麼您應該在數據訪問模式規範中使用(假設您的源爲DB)「SQL命令」。選擇不同的數據,就是這樣..你也可以節省一點時間,因爲ETL不必經歷分類組件。

enter image description here

1

我曾在3個步驟,這樣做的話吧:

  1. 轉儲MillionRow表到HashDump表,它只有2列:ID INT身份PK,和Hash VARBINARY(20) 。該表應在其哈希列上編制索引。
  2. 將HashDump錶轉儲爲由Hash列排序的HashUni。之間將是一個腳本組件,用於檢查當前行的哈希列值是否與前一行相同。如果相同,則直接將行重複輸出,否則爲唯一。這樣,即使您需要的只是Unique,您也可以記錄重複項。
  3. 將MillionRow錶轉儲到MillionUni表中。在之間將是一個使用HashUni來查明哪一行是唯一的查找組件。

此方法允許我使用以下消息記錄每個副本:「行1000是行100的副本」。

我還沒找到比這更好的方法。早些時候,我在MillionUni上創建了一個獨特的索引,將百萬行直接轉儲到其中,但是我無法使用「快速加載」,這太慢了。

這裏是填充哈希列的一種方法:

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append(Row.Col1String_IsNull ? "" : Row.Col1String); sb.Append("|"); 
    sb.Append(Row.Col2Num_IsNull ? "" : Row.Col2Num.ToString()); sb.Append("|"); 
    sb.Append(Row.Col3Date_IsNull ? "" : Row.Col3Date.ToString("yyyy-MM-dd")); 
    var sha1Provider = HashAlgorithm.Create("SHA1"); 
    Row.Hash = sha1Provider.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString())); 
} 

如果200列證明是一個苦差事你的this article部位應激勵你。它將所有列對象的值循環爲單個字符串。

並比較散列,使用this method

byte[] previousHash; 
int previousRowNo; 

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    if (StructuralComparisons.StructuralEqualityComparer.Equals(Row.Hash, previousHash)) 
    { 
     Row.DupRowNo = previousRowNo; 
     Row.DirectRowToDuplicate(); 
    } 
    else 
    { 
     Row.DirectRowToUnique(); 
    } 
    previousHash = Row.Hash; 
    previousRowNo = Row.RowNo; 
}