SSIS 包中的 "ROW PER BATCH" 和 "MAX INSERT COMMIT SIZE" 是否有任何相关性?

Is there any releavance for "ROW PER BATCH" AND "MAX INSERT COMMIT SIZE" IN SSIS PACKAGES?

我有 SSIS 包,它正在将包含 1000 万条记录的 2.5 GB 数据导出到 Sql 服务器数据库,该数据库有 10 个分区,包括主文件组。

在更改默认值之前最大插入提交大小 即“2147483647”和每批行。完成转换需要 7 分钟快速加载选项。

但是用一些公式改变了一些不错的值后,执行只用了 2 分钟。

仅供参考- DefaultMaxBufferRows & DefaultMaxBufferSize 是两种场景中的默认值,即分别为 10000 和 10 MB。

计算最大插入提交大小 & 每批行数 使用以下计算。

1) 正在传输的源记录的计算长度。大约有 1038 个字节。

CREATE TABLE [dbo].[Game_DATA2](
    [ID] [int] IDENTITY(1,1) NOT NULL, -- AUTO CALCULATED
    [Number] [varchar](255) NOT NULL, -- 255 bytes
    [AccountTypeId] [int] NOT NULL, -- 4 bytes
    [Amount] [float] NOT NULL,-- 4 bytes
    [CashAccountNumber] [varchar](255) NULL, -- 255 bytes
    [StartDate] [datetime] NULL,-- 8 bytes
    [Status] [varchar](255) NOT NULL,-- 255 bytes
    [ClientCardNumber] [varchar](255) NULL -- 255 bytes
)

2) 每批行数 = packate_size/bytes 每条记录 =32767/1038 =32 约

3) 最大插入提交大小 = 包大小 * 事务数 = 32767*100=3276700 (包裹大小和交易数量是可变的,可以根据要求改变)

问题:

这些参数仅指快速加载模式下的 DFT OLE DB 目标。快速加载中的 OLE DB 目标发出 insert bulk 命令。这两个参数通过以下方式控制它:

  • 最大插入提交大小 - 控制在单个批次中插入的数据量。因此,如果您将 MICS 设置为 5000,并且您有 9000 行,并且您在前 5000 个结果中遇到错误,则将回滚整批 5000 个结果。 MISC 等同于 BULK INSERT transact-sql 命令中的 BATCHSIZE 参数。
  • 每批行数 - 只是对查询优化器的提示。此值应设置为实际预期的行数。 RPB 等同于 BULK INSERT transact-sql 命令的 ROWS_PER_BATCH 参数。
    为 MICS 指定一个值将产生一些影响。每个批次都被复制到事务日志,这将导致它快速增长,但提供了在每个批次之后备份该事务日志的能力。此外,如果您在目标 table 上有索引,并且如果您没有使用 table 锁定,那么拥有大批量会对内存产生负面影响,您可能会发生更多阻塞。

BULK INSERT (Transact-SQL) - MS Article 在此命令上。

DefaultBuffermaxsizeDefaultBuffermaxrows 控制 DFT 本身内部的 RAM 缓冲区管理,并且不干扰上述选项。

亲爱的 Harsimranjeet 辛格;

根据我的个人经验,Rows_Per_Batch 确定 oledb_destination 必须从 DFT 组件接收的每批次的行数,而 DefualtBuffermaxrows 确定 DFT 的 bacth 大小,因此 DefualtBuffermaxrows 取决于规范SSIS 服务器和 Rows_Per_Batch 取决于目标服务器,每个都必须根据其条件进行设置。

同时 Maximum_Insert_Commit_Size 确定记录数,当它达到数字时写入日志文件并提交;减少这个数字,会增加引用日志的计数,这很糟糕,但它会导致 MSDB(系统数据库)没有膨胀,这对提高性能非常有益。

还有一点,就是DefualtBuffermaxrows和DeafultBufferSize的关系,必须一起设置。 DefualtBuffermaxrows 乘以每条记录的大小必须大约等于 DeafultBufferSize,如果它更大,则 ssis 将其减小以达到该值,如果它小于该值且小于最小缓冲区大小,则将其增加以达到最小缓冲区大小。这些操作严重降低了你的包的性能。

祝你好运!

每批行数 - 此设置的默认值为 -1,它指定所有传入行将被视为单个批次。您可以更改此默认行为并将所有传入行分成多个批次。允许的值只能是正整数,指定批处理中的最大行数。

最大插入提交大小 - 此设置的默认值为“2147483647”(4 字节整数类型的最大值),它指定所有传入行将在成功时提交一次完成。您可以为此设置指定一个正值,以指示将为这些记录数完成提交。您可能想知道,更改此设置的默认值会给数据流引擎带来多次提交的开销。是的,这是真的,但同时它会释放事务日志和 tempdb 的压力,特别是在大量数据传输期间会大幅增长。

了解以上两个设置对于提高tempdb和事务日志的性能非常重要。例如,如果您将 'Max insert commit size' 保留为默认值,事务日志和 tempdb 将在提取过程中继续增长,如果您正在传输大量数据,tempdb 将很快 运行 内存不足,因为结果,您的提取将失败。因此建议根据您的环境将这些值设置为最佳值。

注意:以上建议是根据过去几年使用 DTS 和 SSIS 获得的经验得出的。但如前所述,还有其他影响性能的因素,其中之一是基础设施和网络。因此,在将这些更改放入生产环境之前,您应该进行彻底的测试。