Ton*_*ony 7 sql-server-2008 etl 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 的回答和关于删除垃圾目标的建议后,我不确定它会是这样。
我认为该数据流没有明显的问题。我总是建议在源查询中做尽可能多的工作,因此,如果您可以在一开始就创建一个数据集,允许您通过简单的拆分来填充两个表,那么它肯定会使用更少的内存。但根据数据源和数据格式,类似的事情并不总是可行。
此外,垃圾目的地有利于开发/调试,但对生产没有好处。去掉它。让“不需要的数据”在分裂时到期。SSIS 可以解决剩下的问题。
只要避免阻塞组件(UNION、MERGE 等),这个过程就没有任何理由需要花费数天时间。我经常在 SSIS 中处理数百万行,不会出现任何问题。SSIS 的速度与设计流程的人一样慢。
目前是否存在性能问题?
归档时间: |
|
查看次数: |
6662 次 |
最近记录: |