“缓冲区大小”和“最大行数”与多个源和目标流“每批次的行数”和“插入提交大小”的关系是啥?

Posted

技术标签:

【中文标题】“缓冲区大小”和“最大行数”与多个源和目标流“每批次的行数”和“插入提交大小”的关系是啥?【英文标题】:What is the "Buffer Size" & "Max Rows" Relationship to Multiple Source and Destination flows "Rows Per Batch" and "Insert Commit Size"?“缓冲区大小”和“最大行数”与多个源和目标流“每批次的行数”和“插入提交大小”的关系是什么? 【发布时间】:2019-09-25 17:58:06 【问题描述】:

我有一个数据流任务,它将一堆数据从多个来源移动到多个目的地。总共大约50个。移动的数据从一个数据库转移到另一个数据库,每个流中的行和列各不相同。

虽然我相信我理解数据流任务的 DefaultBufferMaxRowsDefaultBufferSize 背后的基本思想,因为它与 每批次的行数有关 和目标的最大插入提交大小,我不清楚当有多个不相关的源流和目标流时会发生什么。

我想知道以下哪个最有意义:

将所有源流和目标流划分为单独的数据流任务 将它们分成大小和行数大致相同的组 保持原样,只需确保设置具有足够缓冲区行数和缓冲区大小的属性,同时将每批行数最大插入提交大小设置为个人目的地

我相信我读过一些地方,最好将每个源和目标都放在它自己的数据流任务中,但我目前无法找到链接。

我能够在网上找到的大多数示例似乎总是一个来源到一个或多个目的地,或者只是一对一。

【问题讨论】:

您好,欢迎布莱恩。尽管您的问题本身很好,并且对于了解主题的人(不是我)来说似乎很有趣,但问题标题似乎有点乏味,可能会阻止您获得应得的答案。 您对如何表达问题有什么建议吗?可能是“关于 SSIS 数据流任务属性的问题”? 也许只是“在 SSIS 中,'Buffer Size'、'Max Rows'、'Rows Per Batch' 和 'Insert Commit Size' 是什么?” 【参考方案1】:

让我从基础出发。数据流任务是一个任务,组织从数据源数据目的地的数据管道。这是 SSIS 中的一项独特任务,因为它在 SSIS 本身中运行数据操作,所有其他任务都调用外部系统来处理来自 SSIS 的数据。 关于 DefaultBufferMaxRowsDefaultBufferSizeRows per Batch 和 Destination 的 Maximum insert commit size 之间的关系.没有直接关系。 DefaultBufferMaxRowsDefaultBufferSize 是数据流管道的属性;管道批量处理行,这些属性控制处理批量大小。这些属性控制 RAM 消耗和数据流任务的性能。 另一方面,Rows per BatchMaximum insert commit size 是Data Destination 的属性,即仅Fast Load 模式下的OLE DB Destination;它控制数据目标本身的性能。您可能有一个带有平面文件目标的数据流,其中没有 Rows per Batch,但它肯定会有 DefaultBufferMaxRowsDefaultBufferSize 属性。

根据我的经验的典型用法:

DefaultBufferMaxRowsDefaultBufferSize 控制数据流管道的批量大小。调整它是一种权衡 - 更大的批次意味着更少的批处理开销,即更少的执行时间,但更多的 RAM 消耗。更多 RAM 意味着您可能会遇到 RAM 中断,并且 DFT 数据缓冲区将被交换到磁盘。 在 SSIS 2016+ 中有一个“神奇的设置”AutoAdjustBufferSize,它告诉引擎自动增长缓冲区。 这些属性的值通常在 QA 环境中的性能测试中定义。在开发中 - 使用默认值。 Rows per BatchMaximum insert commit size -- 控制日志增长和回滚所有更改的可能性。除非您确实需要,否则请勿更改这些内容。默认值一般都可以;我很少因特殊原因更改它。更多关于its functions。

关于包装设计:

每个 DFT(数据流任务)一对 Source-Destination。这是最佳的 - 在调整和执行顺序等方面为您提供大部分控制。您还可以利用 SSIS 引擎并行执行任务。顺便说一句,它简化了调试和支持。 分组。您可以在序列组中对 DFT 进行分组,并通过 Expressions-Variables 定义公共属性。但是 - 如果您真的需要这样做,请使用它,因为它会使您的设计复杂化。 一个 DFT 中的所有源-目标。我建议不要这样做,复杂且容易出错。

作为底线,保持简单 - 每个 DFT 有 1 对 Source-Destination,仅在必要时使用您的参数。

【讨论】:

很棒的帖子,感谢您抽出宝贵时间回复。看起来我还有一些工作要做,然后如果我要将所有这些 Source -> Destination 移动到单独的 DFT 中,但这可能是值得的。 @BrianBrianBrian 除了接受答案之外,您还可以对答案进行投票。 赞成 - 使用 2016 有一段时间了,刚刚从这个答案中发现了 AutoAdjustBufferSize。谢谢!

以上是关于“缓冲区大小”和“最大行数”与多个源和目标流“每批次的行数”和“插入提交大小”的关系是啥?的主要内容,如果未能解决你的问题,请参考以下文章

画布 globalCompositeOperation 源输入和目标输入不能与多个源和目标一起使用

14. 流文件和IO

从可变源和目标位置复制文件并重命名重复项

CopyFiles 使用电子表格列作为源和目标

如何解决TCP拆包粘包问题

为啥缓冲区大小会影响音频数据?