我有一个数据流,可以将数据从旧数据库迁移到新数据库。旧设计将所有数据和历史信息(更改)存储在单个表中,并针对行使用“版本”(递增整数)。
新设计有两个表,一个用于数据的“当前”状态,另一个用于记录使用触发器的更改的审计(或历史)表。因此,“当前”数据仅存在一行,并且历史记录行很多。
在我的 SSIS 包中,我使用以下组件将当前数据复制到一个表,然后将所有数据发送到审计表。
Multicast 用于拆分数据流,Conditional Split 标识“当前”行并将其发送到 Order 表(在任何人评论使用保留字作为表名之前,该表实际上并不称为Order )。
我创建了这个流,因为我看不到使用条件拆分将所有数据发送到审计目标并且仅将当前行发送到另一个的方法。
我假设创建所有重复数据然后将其丢弃到垃圾目的地不是很有效,因为我有大约 52m 行要迁移,我担心转换需要几天时间。
有没有更好(更有效)的方法来实现数据拆分?
关于数据的注意事项:我已将 a 应用于row_number()
允许我将“当前”行标识为数字 1 的数据,包括“当前”在内的所有行都需要转到审计表目标。
编辑: 我找到了 SSIS Junkie 的这篇博客文章建议的多播和条件拆分的替代方法:同步脚本转换的多个输出
它使用脚本组件将数据发送到一个或多个输出。我正在尝试这种方法,看看它是否更快,但是在看到 Kenneth 关于删除垃圾目的地的回答和建议之后,我不确定它是否会更快。
我认为该数据流没有明显的问题。我总是建议在你的源查询中做尽可能多的工作,所以如果你可以在一开始就创建一个数据集,允许你通过简单的拆分来填充两个表,它肯定会使用更少的内存。但是根据数据源和数据格式,这样的事情并不总是可能的。
此外,垃圾目的地有利于开发/调试,但对生产没有好处。去掉它。让“不需要的数据”在拆分时过期。SSIS 可以解决剩下的问题。
只要您避免阻塞组件(UNION、MERGE 等),这个过程就没有任何理由需要几天时间。我经常在 SSIS 中处理数百万行而没有问题。SSIS 的速度与设计流程的人一样慢。
它目前是否存在性能问题?