1

我已将 sql server 属性中的内存设置更改为低内存。此外,我已将缓冲区临时路径更改为系统的特定位置。但是为什么包因内存不足而失败?如果我们设置缓冲区临时和blob temp,数据应该交换到那个临时位置对吗?那么如果它失败了,缓冲区临时有什么用?

4

1 回答 1

5

有点相关SSIS 2005 中 BufferTempStoragePath 的默认文件路径位置是什么?特别是,阅读来自 bimonkey 的链接文章,该文章涉及从 sql 代理服务帐户访问磁盘上的这些位置。

一般来说,当你的包报告内存不足时,这是由于使用了完全阻塞转换和查找任务拉回太多数据。如果您的包大量使用阻塞转换,请尝试将工作卸载到源系统。如果查找是罪魁祸首,请尝试在查询中更具选择性。不要拉回整个表,只拉你需要的列。如果这不够有选择性,您可以尝试使用 where 子句过滤该数据集(我只需要当年的数据等)。否则,将查找从完全缓存模式切换到部分缓存或无缓存。对于通过的每一行,没有缓存会导致对源系统的一次性查询。它将没有记忆,它在 2 行前运行了完全相同的查询。部分缓存通过将 X MB 数据保存在内存中来解决这一难题。如果您想了解有关如何减少内存使用的更多详细信息,请发布一些有关您的包外观的屏幕截图。另请注意,

数据流的架构是将数据读入内存缓冲区,并将这些缓冲区的地址传递给各种任务。不是每个任务都需要分配给它们的内存来保存通过它们的数据,而是它们都使用相同的共享内存集。将内存从一个任务复制到另一个任务会很慢,而且在内存消耗方面非常昂贵。

有了前言,什么是BufferTempStoragePath 和 BlobTempStoragePath?每当您将大型对象类型(n/varchar(max)、xml、图像等)拉入数据流时,该数据不会像本机类型那样保存在内存缓冲区中。相反,它被写入磁盘,指向该地址的指针被放入内存缓冲区。BufferTempStoragePath 用于当您的数据流任务仍有工作要做但您要么

  • 使你的记忆如此碎片化(通过完全/部分阻塞转换)引擎无法再获得
  • 试图在一个任务中做太多该死的事情。我的经验法则是,我应该能够跟踪从包中的任何转换到所有源和目标的线。如果您从导入/导出向导创建了一个包,那么这些数据流是拆分为单独流的主要候选者,因为它喜欢将不相关的事物分组到一个数据流中,这会使它们占用大量内存。
  • 盒子根本没有足够的资源来处理数据。我通常更愿意避免在工作中投入更多的硬件,但如果你已经解决了前两颗子弹,这将是我手枪中的最后一颗。
于 2012-05-10T16:55:57.533 回答