SSIS多播性能问题

Eva*_*van 4 etl ssis

我想知道多播实际上是如何工作的。所以这是我的设置。我有一个大约 10 万行的源平面文件 (csv),可能大约有 250-300 列,我正在将该文件多播到 7 个一对一表中。这些表中只有主键列是重复的。这个设置似乎工作正常,但现在看来我们可能遇到了内存问题。我想知道将数据多播到 7 个目的地是否太多。关于内存使用的任何想法?我真的不在乎它的运行速度有多快,只是想减少内存使用量。

我想到的一种替代方法是可能只是为同一个文件创建 7 个不同的连接管理器,然后按顺序运行所有内容。那会更好吗?谢谢!

bil*_*nkc 5

SSIS 通过成为内存中的转换引擎来获得强大的力量。数据流任务中的基本工作单元是缓冲区。如果您想知道为什么 SSIS 对数据类型如此挑剔,那是因为它计算一行的成本,然后为 N 行分配内存。*所有下游组件都使用相同的内存地址来完成它们的 ETL 部分,这允许并行化。这意味着具有 1 个输出的多播与具有 10 个输出的多播的成本相同。它只是允许多个组件使用数据。

我不能 100% 确定预多播的情况,我有一个名为 SSN 的专栏。在从MC输出1,I腐-5数字到位并写入到目的地和输出2与未改变的版本,必须有与该相关联的附加存储器的成本,但我假定它只是用于列所需的空间被复制。

*所有下游组件都使用相同的内存地址,直到您引入异步组件(排序、聚合等)。当那些命中数据流时,缓冲区结束,数据从内存空间 1 复制到内存空间 2。从“我只是将列数从 100 减少到 10”的角度来看,这听起来不错,但你已经崩溃了“异步组件之前”和“异步之后”之间的总内存空间。您不能一次运行 100 个缓冲区,而是在 30 个之前和 70 个之后,并且中间的内存复制是一项昂贵的操作。

如果您想减少内存使用量,请构建您的包以减少使用量;)

  • 您可以通过避免异步转换来减少使用。
  • 只拉入您需要的列。
  • 如果您要查找,请编写一个明确枚举所需列的查询,而不是单击下拉列表中的表格。
  • 如果您有查找,请查看限制返回的行的深度。如果你只需要查找当前值,在上面的查询中,让它WHERE ISCurrent = CAST(1 AS bit);
  • 注意你的数据类型。从文件导入,不要偷懒,从字符串开始只是为了稍后转换为数据类型(除非您对数据清洁度有疑问)
  • 还要注意您的数据类型!您不太可能处理来自平面文件的二进制/LOB 数据类型,但这些数据类型不能肯定地适合内存,因此 SSIS 将在内存中携带一个指向磁盘地址的指针。虽然这不会占用您所有的内存,但它确实会减慢处理速度,因为在操作期间会创建和销毁许多小文件