gpt4 book ai didi

ssis - 执行 SSIS 包创建巨大的没有。临时文件,这让我用完了磁盘空间

转载 作者:行者123 更新时间:2023-12-04 22:34:09 24 4
gpt4 key购买 nike

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

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

最佳答案

为什么包创建临时文件?

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

为什么要按照@jeff hornby 建议的帮助来重组软件包?

完全和部分阻塞的转换会强制在数据流中进行内存复制。假设您有 10 个存储桶,每个存储桶承载 1MB 的数据。当您使用阻塞转换时,当这些存储桶到达转换时,数据必须从一个内存位置复制到另一个内存位置。您现在已经将包的总内存消耗增加了一倍,因为在联合所有转换之前使用了 10MB 的数据,然后在它之后又使用了 10MB。

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

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

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

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

并行处理过多。 SSIS 很棒,因为您可以免费并行处理您的处理。除非你可以拥有太多的好东西。如果您有 20 个数据流都漂浮在空间中,它们之间没有优先级,则集成服务引擎可能会尝试同时运行所有这些数据流。在它们之间添加一个优先约束,即使它只是在完成(成功/失败时)以强制某些操作序列化。在数据流内部,您可以通过进行不相关的操作来引入相同的挑战。我的经验法则是,从任何来源或目的地开始,我应该能够到达所有其他来源/目的地。

我还可以做些什么?

检查盒子上还有什么正在使用内存。 Have you set a sane (non-default) maximum memory value for SQL Server ? SSIS 就像 RAM 就像一个胖 child 喜欢蛋糕,所以你需要平衡 SSIS 的内存需求和数据库本身——它们有完全独立的内存空间。

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

最后,添加更多 RAM。如果您无法通过执行上述操作来使包变得更好,请向其投入更多硬件并完成。

关于ssis - 执行 SSIS 包创建巨大的没有。临时文件,这让我用完了磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com