首页 文章

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

提问于
浏览
2

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

在更改默认值 Max Insert Commit size 之前,即"2147483647"和 Row per batch . 使用快速加载选项完成转换需要7分钟 .

但是在用一些公式来衡量一些不错的 Value 之后,执行只用了2分钟就完成了 .

FYI- DefaultMaxBufferRowsDefaultMaxBufferSize 都是scenorio中的默认值,即分别为10000和10 MB .

计算 Max Insert Commit sizeRow per batch 使用以下calUSation .

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 /字节数= 32767/1038 =约32 .

3)最大插入提交大小=包大小*事务数= 32767 * 100 = 3276700(包装大小和数量事务变量可根据需要改变)

题 :

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

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

3 回答

  • 0

    亲爱的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

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

    • Maximum insert commit size - 控制单个批次中插入的数据量 . 因此,如果您将MICS设置为5000并且您有9000行并且在前5000个结果中遇到错误,则将回滚整批5000 . MISC等于BULK INSERT transact-sql命令中的BATCHSIZE参数 .

    • Rows Per Batch - 仅提示查询优化器 . 应将此值设置为实际预期的行数 . RPB等于BULK INSERT transact-sql命令的ROWS_PER_BATCH参数 .
      为MICS指定值将产生一些影响 . 每个批处理都会复制到事务日志中,这会使其快速增长,但可以在每个批处理后备份该事务日志 . 此外,如果目标表上有索引,则拥有大批量将对内存产生负面影响,如果您没有使用表锁定,则可能会有更多阻塞 .

    MS Article关于此命令 .

    DefaultBuffermaxsizeDefualtBuffermaxrows 控制DFT内部的RAM缓冲区管理,并且不干扰上述选项 .

  • 0

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

    Maximum insert commit size - 此设置的默认值为'2147483647'(4字节整数类型的最大值),指定成功完成后将提交一次所有传入行 . 您可以为此设置指定正值,以指示将对这些数量的记录执行提交 . 您可能想知道,更改此设置的默认值会使数据流引擎上的开销多次提交 . 是这是事实,但同时它将释放事务日志和tempdb上的压力,以便在高容量数据传输期间大幅增长 .

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

    Note: 上述建议是根据过去几年与DTS和SSIS合作所取得的经验完成的 . 但如前所述,还有其他影响性能的因素,其中之一是基础设施和网络 . 因此,在将这些更改放入 生产环境 环境之前,您应该进行全面测试 .

相关问题