Sql 如何在10亿行表SSI中实施重复数据消除
在ssis中实现不同操作的最佳选项是什么? 我有一个表,有200多列,包含1000多万行。 我需要从此表中获取ditinct行。使用execute sql任务(使用select query删除行的重复数据)明智吗?还是在ssis中有其他方法实现这一点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排序组件会消除行中的重复数据。但这是一个阻塞组件,使用它根本不是一个好主意…请让我知道您对此的看法我不会为此而打扰ssis,只需几个查询即可;此外,您还有大量数据,因此我建议您在运行查询之前检查执行计划,并优化索引
查看我在同一主题上写的一篇小文章据我所知,排序组件是唯一允许您区分重复性的转换。或者您可以使用类似SQL的命令。
如果排序操作有问题,那么应该在数据访问模式规范中使用(假设源是DB)“SQL命令”。选择您的数据,就这样。。您还可以节省一些时间,因为ETL不必经过排序组件
我用这种方法分三步完成:
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;
}