执行SSIS包创建了巨大的数量。临时文件使我的磁盘空间不足

sqlbulkcopy ssis

我有一个ssis包,我使用sql作业运行,用于将数据从一个数据库批量复制到另一个数据库。目的地是我们的集成服务器,我们有足够的空间存放数据库。但是,当我运行这个工作(即包)。它在localsettings / temp文件夹中创建了大量的临时文件,按1GB mdf文件的顺序创建了大约20GB的临时文件。我手动创建了这个包,并没有使用导入导出向导。任何人都可以帮助我在执行时如何避免这种巨大的临时文件?如果有任何进一步的细节需要提及。

注意:很多人说如果我们使用导入导出向导创建一个包并为许多表设置优化,则会发生这种情况。但是在这个包中,我只查询一个表并且手动创建而不使用导入导出向导。

热门答案

为什么包创建临时文件?

SSIS是一种内存中的ETL解决方案,除非它无法将所有内容保存在内存中并开始交换到磁盘。

为什么要重组这个包@jeff hornby建议帮忙?

完全和部分阻塞转换会强制数据流中的内存副本。假设您有10个桶,每个桶携带1MB数据。当您使用阻塞转换时,当这些存储桶到达转换时,必须将数据从一个内存位置复制到另一个内存位置。你现在已经将你的软件包总内存消耗量增加了一倍,因为你在union all转换之前使用了10MB的数据,然后又是10MB的数据。

仅使用您需要的列。如果列不在目标中,请不要将其添加到数据流中。使用数据库执行排序和合并。在数据流到数据流之前将数据转换为适当的类型。

还有什么可能导致临时文件使用

查找转换。我看到人们在使用SELECT * FROM dbo.BillionRowTable时会破坏他们的ETL服务器,当他们只需要当前时间段的一列或两列时。查找操作的默认行为是执行该源查询并将结果缓存在内存中。对于宽大和/或深度的大型表,这可能使您的数据流看起来甚至没有运行,因为SSIS忙于流式传输并将所有这些数据作为预执行阶段的一部分进行缓存。

二进制/ LOB数据。在源表中有(n)varchar(max)/ varbinary(max)或经典BLOB数据类型?对不起,那不会在记忆中。相反,数据流将携带指针并为这些对象中的每一个写出文件。

并行处理太多。 SSIS非常棒,因为您可以自由地平行化。除了你可以有太多好事。如果您有20个数据流全部浮动在空间中而它们之间没有优先权,则Integration Services引擎可能会尝试一次运行所有这些数据流。在它们之间添加优先约束,即使它刚刚完成(成功/失败时)以强制执行某些操作序列化。在数据流中,您可以通过进行不相关的操作来引入相同的挑战。我的经验法则是从任何来源或目的地开始,我应该能够到达所有其他来源/目的地。

我还可以做些什么?

检查盒子上还有哪些内存使用内存。 您是否为SQL Server设置了理智(非默认)最大内存值 ?像胖孩子一样喜欢RAM的SSIS喜欢蛋糕,所以你需要平衡SSIS对数据库本身的内存需求 - 它们有完全独立的内存空间。

每个数据流都能够设置[BufferTempStoragePath和BlobTempStoragePath 2 。利用这一点并将其放在具有足够存储空间的驱动器上

最后,添加更多RAM。如果您不能通过执行上述操作来改进包装,则可以使用更多硬件并完成。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因