Sql 如何在10亿行表SSI中实施重复数据消除

Sql 如何在10亿行表SSI中实施重复数据消除,sql,sql-server,sql-server-2008,ssis,etl,Sql,Sql Server,Sql Server 2008,Ssis,Etl,在ssis中实现不同操作的最佳选项是什么? 我有一个表,有200多列,包含1000多万行。 我需要从此表中获取ditinct行。使用execute sql任务(使用select query删除行的重复数据)明智吗?还是在ssis中有其他方法实现这一点 我知道ssis排序组件会消除行中的重复数据。但这是一个阻塞组件,使用它根本不是一个好主意…请让我知道您对此的看法我不会为此而打扰ssis,只需几个查询即可;此外,您还有大量数据,因此我建议您在运行查询之前检查执行计划,并优化索引 查看我在同一主题

在ssis中实现不同操作的最佳选项是什么? 我有一个表,有200多列,包含1000多万行。 我需要从此表中获取ditinct行。使用execute sql任务(使用select query删除行的重复数据)明智吗?还是在ssis中有其他方法实现这一点


我知道ssis排序组件会消除行中的重复数据。但这是一个阻塞组件,使用它根本不是一个好主意…请让我知道您对此的看法

我不会为此而打扰ssis,只需几个查询即可;此外,您还有大量数据,因此我建议您在运行查询之前检查执行计划,并优化索引


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

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


我用这种方法分三步完成:

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

    我没有找到比这更好的办法。早些时候,我对Millionni创建了一个唯一的索引,直接将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个专栏证明对你来说是件苦差事,那么其中的一部分将激励你。它将所有列对象的值循环到单个字符串中

    要比较散列,请使用:


    为什么排序组件没有用?据我所知,这是唯一一个可以让你区分双重性的转换。或者您可以使用类似SQL的命令。您是在尝试检索不同的行还是从原始表中删除重复项?对组件进行排序,然后再执行重复数据消除。因此,我的问题是使用排序还是使用SQL。哪一个更适合删除重复项我的数学有点模糊,1000万行如何变成10亿行
    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;
    }