如何在十亿行表中实现重复数据删除

时间:2013-08-16 12:36:24

标签: sql sql-server sql-server-2008 ssis etl

哪个是在ssis中实现不同操作的最佳选择? 我有一个包含200多列的表,包含超过1000万行。 我需要从这个表中获取ditinct行。使用执行sql任务(使用select查询对行进行重复数据删除)是明智的还是有任何其他方法可以在ssis中实现这一点

我确实理解ssis sort组件对行进行重复数据删除..但这是一个阻塞组件,使用它并不是一个好主意...请告诉我你对此的看法

3 个答案:

答案 0 :(得分:1)

我这样做了3步:

  1. 将MillionRow表转储到HashDump表中,该表只有2列:Id int identity PK和Hash varbinary(20)。该表应在其Hash列上编入索引。
  2. 将HashDump表转储到由Hash列排序的HashUni中。中间是一个脚本组件,用于检查当前行的哈希列值是否与前一行相同。如果相同,直接行到Duplicate输出,否则为Unique。通过这种方式,您可以记录复制,即使您需要的只是唯一。
  3. 将MillionRow表转储到MillionUni表中。在两者之间将是一个Lookup组件,它使用HashUni来判断哪一行是唯一的。
  4. 此方法允许我使用以下消息记录每个重复项:"第1000行是第100行和第34行的副本。

    我没有找到比这更好的方法。早些时候,我在MillionUni上创建了一个独特的索引,直接将MillionRow转储到其中,但我无法使用"快速加载",这太慢了。

    以下是填充哈希列的一种方法:

    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;
    }
    

答案 1 :(得分:0)

我不会为此烦恼SSIS,会有几个问题;你也有很多数据,所以我建议你在运行查询前检查执行计划,并优化索引

http://www.brijrajsingh.com/2011/03/delete-duplicate-record-but-keep.html

查看我在同一主题上写的一篇小文章

答案 2 :(得分:0)

据我所知,Sort Component是唯一允许您区分重复的转换。或者您可以使用类似SQL的命令 如果排序操作有问题,那么您应该在数据访问模式规范中使用(假设您的源是DB)“SQL命令”。选择不同的数据,就是这样......你也可以节省一点时间,因为ETL不需要通过排序组件。

enter image description here