在 SSIS 中复制数据流的某些行

Ton*_*ony 7 sql-server-2008 etl ssis

我有一个数据流可以将数据从旧数据库迁移到新数据库。旧设计将所有数据和历史信息(更改)存储在单个表中,并针对该行使用“版本”(递增整数)。

新设计有两个表,一个用于数据的“当前”状态和一个使用触发器记录更改的审计(或历史)表。因此,“当前”数据仅存在一行,并且有许多历史记录行。

在我的 SSIS 包中,我使用以下组件将当前数据复制到一个表,然后将所有数据发送到审计表。

SSIS 数据流

多播用于拆分数据流,条件拆分标识“当前”行并将其发送到 Order 表(在任何人评论使用保留字作为表名之前,该表实际上并不称为Order)。

我创建了这个流,因为我看不到使用条件拆分将所有数据发送到审核目标的方法,而仅将当前行发送到另一个。

我假设创建所有重复数据然后将其丢弃到垃圾箱目标不是很有效,因为我有大约 5200 万行要迁移,我担心转换需要几天时间。

有没有更好(更有效)的方法来实现数据拆分?

关于数据的注意事项:我已将 a 应用于row_number()数据,这使我可以将“当前”行标识为编号 1,包括“当前”在内的所有行都需要转到审计表目标。

编辑: 我找到了 SSIS Junkie 的这篇博文建议的 Multicast 和 Conditional Split 的替代方案 Multicast and Conditional Split: Multiple output from a synchronous script transform

它使用脚本组件将数据发送到一个或多个输出。我正在尝试这种方法,看看它是否更快,但在看到 Kenneth 的回答和关于删除垃圾目标的建议后,我不确定它会是这样。

Ken*_*eth 3

我认为该数据流没有明显的问题。我总是建议在源查询中做尽可能多的工作,因此,如果您可以在一开始就创建一个数据集,允许您通过简单的拆分来填充两个表,那么它肯定会使用更少的内存。但根据数据源和数据格式,类似的事情并不总是可行。

此外,垃圾目的地有利于开发/调试,但对生产没有好处。去掉它。让“不需要的数据”在分裂时到期。SSIS 可以解决剩下的问题。

只要避免阻塞组件(UNION、MERGE 等),这个过程就没有任何理由需要花费数天时间。我经常在 SSIS 中处理数百万行,不会出现任何问题。SSIS 的速度与设计流程的人一样慢。

目前是否存在性能问题?