在SSIS包装中是否有“每批次”和“最大插入承诺尺寸”的重新分配?

时间:2016-12-09 06:05:43

标签: sql-server ssis sql-server-2012 business-intelligence ssis-2012

我有SSIS包,它将包含1000万条记录的2.5 GB数据导出到Sql Server数据库中,该数据库有10个分区,包括PRIMARY FILE GROUP。

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

但是在用一些公式来衡量它的价值之后,执行只用了2分钟就完成了。

FYI- DefaultMaxBufferRows & DefaultMaxBufferSize 是两个scenorio中的默认值,分别为10000和10 MB。

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

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 (包装大小和数量交易是可变的,可根据要求改变)

问题:

  • 每批次的行数和最大插入提交大小是否相关?由于存档article中没有提及用于调整DFT(数据流任务)执行的信息。

  • 这些配置是否与DefaultBuffermaxzie和
    一起使用 DefualtBuffermaxrows?如果是的话怎么样?

3 个答案:

答案 0 :(得分:5)

这些参数仅指DFT OLE DB Destination。 OLE DB Destination发出insert bulk命令。这两个参数以下列方式控制它:

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

BULK INSERT (Transact-SQL) - MS Article关于此命令。

DefaultBuffermaxsize DefaultBuffermaxrows 控制DFT内部的RAM缓冲区管理,并且不会干扰上述选项。

答案 1 :(得分:1)

亲爱的Harsimranjeet Singh;

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

此外,Maximum_Insert_Commit_Size确定当命中数字时的记录数,然后在日志文件中写入并提交;减少这个数字,使得增加的计数指的是日志,这是不好的,但它导致MSDB(系统数据库)没有膨胀,这对提高性能非常有利。

另一点是DefualtBuffermaxrows和DeafultBufferSize之间的关系,它们必须一起设置。 DefualtBuffermaxrows乘以每条记录的大小必须大约等于DeafultBufferSize,如果这个大于那么ssis减少到达那个并且如果它小于且小于最小缓冲区大小,则将其增加到触摸最小缓冲区大小。这些操作严重降低了包装的性能。

祝你好运!

答案 2 :(得分:1)

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

最大插入提交大小-此设置的默认值为'2147483647'(4字节整数类型的最大值),它指定所有输入行在成功完成后将被提交一次。您可以为此设置指定一个正值,以指示将对那些记录数进行提交。您可能想知道,更改此设置的默认值将使数据流引擎的开销要多次提交。是的,的确如此,但是与此同时,它将释放事务日志和tempdb的压力,使其在进行大量数据传输时显着增长。

了解上述两个设置对于提高tempdb和事务日志的性能非常重要。例如,如果将“最大插入提交大小”保留为默认值,则在提取过程中,事务日志和tempdb将继续增长;如果传输大量数据,由于以下原因,tempdb很快将耗尽内存:这样您的提取将失败。因此,建议根据您的环境将这些值设置为最佳值。

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