SSIS 2019 AutoAdjustBufferSize导致缓冲区分配错误

SSIS 2019 AutoAdjustBufferSize导致缓冲区分配错误,ssis,buffer,ssis-2019,Ssis,Buffer,Ssis 2019,为了提高ETL性能,我在数据流任务上启用了“AutoAdjustBufferSize”属性。 但是,它没有为我需要的内存分配足够的缓冲区 看看SSIS告诉我的 信息:缓冲区管理器对19545664字节的内存分配调用失败,但无法交换任何缓冲区以释放内存压力。考虑了2个缓冲区,并锁定了2个缓冲区。可能是由于安装的内存不足、其他进程正在使用该内存或锁定了太多缓冲区,导致管道可用内存不足 信息:缓冲区管理器在1个物理缓冲区中分配了1864兆字节 错误:系统报告36%的内存负载。物理内存为34156761

为了提高ETL性能,我在数据流任务上启用了“AutoAdjustBufferSize”属性。 但是,它没有为我需要的内存分配足够的缓冲区

看看SSIS告诉我的

信息:缓冲区管理器对19545664字节的内存分配调用失败,但无法交换任何缓冲区以释放内存压力。考虑了2个缓冲区,并锁定了2个缓冲区。可能是由于安装的内存不足、其他进程正在使用该内存或锁定了太多缓冲区,导致管道可用内存不足

信息:缓冲区管理器在1个物理缓冲区中分配了1864兆字节

错误:系统报告36%的内存负载。物理内存为34156761088字节,可用字节为2153558272字节。有4294836224字节的虚拟内存,1996070912字节可用。分页文件有39257034752个字节,有24542248960个字节可用

关于这方面的几个问题:

  • 为什么这里只有两个缓冲区?(最大缓冲行数设置为1048576)
  • 为什么它说它分配了它说它不能分配的相同字节
  • 注意:

    • 当我手动将缓冲区行大小设置为默认值(104857360)时,它可以工作
    • 所有开发和源数据文件都位于网络服务器上。我正在本地计算机中使用visual studio访问开发/源文件

    SSI告诉您,它遇到了RAM压力,请求了19+GB的RAM,但没有结果,然后尝试交换使用的一些缓冲区。但是,从现有的2个缓冲区中,所有2个缓冲区都已使用/锁定,并且无法调出。
    原因可能是您的设置
    AutoAdjustBufferSize=true
    ,它允许数据流缓冲区大量增长,绕过最大缓冲区大小和最大缓冲行设置指定的上限。这就是缓冲区增长超过限制的原因。这样做的主要目的是以更高的RAM利用率为代价来加速数据处理。当您的数据可以快速通过数据流任务时,这是正常的,但如果不是这样,您可能会收到上面提到的错误消息。

    建议-设置
    AutoAdjustBufferSize=false
    并试验不会产生此类错误的缓冲区大小。

    我不同意@Ferdipux中的“绕过最大缓冲区大小和最大缓冲区行指定的上限”的说法。它绕过最大缓冲区大小,但不绕过最大缓冲区行

    我将引用这位官员的话:

    数据流引擎通过计算单个数据行的估计大小来开始调整其缓冲区大小的任务。然后将行的估计大小乘以DefaultBufferMaxRows的值,以获得缓冲区大小的初步工作值。如果AutoAdjustBufferSize设置为true,则引擎数据流引擎将使用计算出的值作为缓冲区大小,并忽略DefaultBufferSize的值

    基于同一站点,SSIS的最大缓冲内存为2GB。您的消息显示有2个缓冲区,可能是因为您有2个任务。这意味着每个任务最多可以有1GB的缓冲区

    您必须计算行大小(请参阅),并在此基础上确定最大行数。从外观上看,你的桌子很宽

    例如:
    您的行大小为1000字节。
    2147483647/1000字节=2147483.647
    2147483.647/2任务=1073741.8235

    因此,为了安全起见,将其四舍五入到1070000行。

    感谢您的见解。我知道AutoAdjust设置将绕过我设置的限制(尽管据我所知,它没有超过我设置的最大缓冲行限制-是吗?)。我不明白的是,为什么它只使用2个缓冲区来分配这么多RAM,而且即使只有2个缓冲区,为什么它不会增加缓冲区大小以满足其需要。在我的本地计算机(我运行程序的地方)中,我总共有30GB的RAM(在“信息”语句中检测到)。为什么SSIS不在自动调整设置中使用它?@WichieArtu,不幸的是,我不能补充上面的解释。经典SSI创建缓冲区时,注意最大缓冲区行数和最大缓冲区大小中指定的限制。SSIS创建具有定义大小的缓冲区。使用AutoAdjust设置,它会创建超出限制的缓冲区,但MS不描述数学。一旦创建了缓冲区,就无法调整其大小。很抱歉回复太晚,但感谢您解释计算。当我对我的ETL过程进行性能测试和优化时,我将实现并测试它。这非常有用,尤其是博客和示例。仅此一项,我就能够将我的表现提高20%。感谢@Iviglious的帮助!