哪个是在ssis中实现不同操作的最佳选择? 我有一个包含200多列的表,包含超过1000万行。 我需要从这个表中获取ditinct行。使用执行sql任务(使用select查询对行进行重复数据删除)是明智的还是有任何其他方法可以在ssis中实现这一点
我确实理解ssis sort组件对行进行重复数据删除..但这是一个阻塞组件,使用它并不是一个好主意...请告诉我你对此的看法
答案 0 :(得分:1)
我这样做了3步:
此方法允许我使用以下消息记录每个重复项:"第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不需要通过排序组件。