SSIS包的优化
Optimalizations of SSIS package
我正在寻找有关优化 SSIS 包的一些技巧。我 运行 很多,但执行时间很长。一些包 运行 包含数千或数百万 (2-15) 条记录。由于夜间时间不再足够,它们有时会重叠 运行 3-4,这使它变得更加困难。
我做了一些测试。
我发现 vievs 在 SSIS 中真的很糟糕......当我 运行 一个 SQL 查询和 select 进入 table 的视图时,它们 运行 更快然后继续 OleDB SOurce/Destination 工作。
当我查看执行时,源行在 5-10 分钟内被 select 编辑超过 5milin 记录,但将数据插入目标 table 需要 10 倍的时间。随着时间的推移,我得到了这些信息。
[SSIS.Pipeline] Information: The buffer manager detected that the system was low on virtual memory, but was unable to swap out any buffers. 4 buffers were considered and 4 were locked. Either not enough memory is available to the pipeline because not enough is installed, other processes are using it, or too many buffers are locked.
Information: Buffer manager allocated 0 megabyte(s) in 0 physical buffer(s).
是否有任何选项可以让事情进展得更快?我需要同时输入 DefaultBufferSize 和 DefaultBufferMaxRows 吗?它默认为 10k 和 10mil。
一些帮助您朝着正确方向前进的注意事项:
- 关于下面的这个错误,这表明服务器 运行ning 你的 ssis 包 运行 内存不足。如建议的那样,这可能是因为您有其他进程消耗了该内存,即同时 运行ning 其他包。
[SSIS.Pipeline] Information: The buffer manager detected that the
system was low on virtual memory, but was unable to swap out any
buffers. 4 buffers were considered and 4 were locked. Either not
enough memory is available to the pipeline because not enough is
installed, other processes are using it, or too many buffers are
locked.
- SSIS 使用内存缓冲区通过数据流处理数据。在任何给定时间最多使用 5 个。在这种情况下,SSIS 无法分配 运行 数据流所需的缓冲区,因为没有足够的可用内存。如果服务器内存不足,增加内存缓冲区的大小只会让事情变得更糟。
- 这里有关于 SSIS 运行 内容的更多详细信息,因此您可以考虑如何使用内存。如果你有多个数据流 运行 在同一个包中并行,默认情况下 SSIS 将 运行 与你服务器上的处理器数量 +2 一样多。所以如果你有 4 个核心,你将同时有 6 个数据流 运行ning。在数据流中,并行执行由 EngineThreads 属性 管理。这里需要注意的重要一点是,数据流在源和 t运行sformations 之间所做的事情的数量是有限的。因此,数据流越不复杂,它的效率就越高 运行.
- 在内存受限的系统中,这对您意味着什么:
- 同时限制包数运行ning
- 限制一个包中并发的数据流数量运行
- 作为最佳实践,数据流中只有 一个源和一个目标
- 保持数据流简单。使用它们将数据从一台服务器移动到另一台服务器。使用 SQL 进行 运行 信息化工作。使用暂存 tables 来登陆您的数据,然后在将其加载到最终 table 之前对其进行操作。即使您没有执行任何 t运行 转换,使用 SQL 和
WHERE NOT EXISTS
子句加载 table 仍然会更有效。
- 一旦您简化了数据流,但您仍然看到性能不佳,隔离瓶颈。 运行 仅包含源的数据流,看看需要多长时间。如果速度很慢,请调整源查询。将后续任务添加到数据流并测量性能。如果您只是目标缓慢的一步,请调整它。
- 要调整目标,请尝试使用没有索引的分段table。使用
TABLOCK
将告诉 SQL 使用最少的日志记录。实施暂存模式后,调整 SQL 以将数据加载到最终 table.
- 为了调整源代码,避免使用视图,因为它们可能包含您不使用的不必要的连接和列,或者使用专用于您的流程的视图,以便它可以正是为您所需要的而写的。如果涉及很多 tables,proc 总体上可能是更好的选择 - 在将数据加入最终最大的 table 之前,使用临时 tables 暂存数据可以提高性能对于 select.
- 不要在生产中使用
WITH (NOLOCK)
提示。 如果数据在您阅读时实际上正在更新,您会想要您的数据在加载之前获得这些更新,不要介意幻读和其他可能发生的可怕事情。
我正在寻找有关优化 SSIS 包的一些技巧。我 运行 很多,但执行时间很长。一些包 运行 包含数千或数百万 (2-15) 条记录。由于夜间时间不再足够,它们有时会重叠 运行 3-4,这使它变得更加困难。 我做了一些测试。 我发现 vievs 在 SSIS 中真的很糟糕......当我 运行 一个 SQL 查询和 select 进入 table 的视图时,它们 运行 更快然后继续 OleDB SOurce/Destination 工作。 当我查看执行时,源行在 5-10 分钟内被 select 编辑超过 5milin 记录,但将数据插入目标 table 需要 10 倍的时间。随着时间的推移,我得到了这些信息。
[SSIS.Pipeline] Information: The buffer manager detected that the system was low on virtual memory, but was unable to swap out any buffers. 4 buffers were considered and 4 were locked. Either not enough memory is available to the pipeline because not enough is installed, other processes are using it, or too many buffers are locked. Information: Buffer manager allocated 0 megabyte(s) in 0 physical buffer(s).
是否有任何选项可以让事情进展得更快?我需要同时输入 DefaultBufferSize 和 DefaultBufferMaxRows 吗?它默认为 10k 和 10mil。
一些帮助您朝着正确方向前进的注意事项:
- 关于下面的这个错误,这表明服务器 运行ning 你的 ssis 包 运行 内存不足。如建议的那样,这可能是因为您有其他进程消耗了该内存,即同时 运行ning 其他包。
[SSIS.Pipeline] Information: The buffer manager detected that the system was low on virtual memory, but was unable to swap out any buffers. 4 buffers were considered and 4 were locked. Either not enough memory is available to the pipeline because not enough is installed, other processes are using it, or too many buffers are locked.
- SSIS 使用内存缓冲区通过数据流处理数据。在任何给定时间最多使用 5 个。在这种情况下,SSIS 无法分配 运行 数据流所需的缓冲区,因为没有足够的可用内存。如果服务器内存不足,增加内存缓冲区的大小只会让事情变得更糟。
- 这里有关于 SSIS 运行 内容的更多详细信息,因此您可以考虑如何使用内存。如果你有多个数据流 运行 在同一个包中并行,默认情况下 SSIS 将 运行 与你服务器上的处理器数量 +2 一样多。所以如果你有 4 个核心,你将同时有 6 个数据流 运行ning。在数据流中,并行执行由 EngineThreads 属性 管理。这里需要注意的重要一点是,数据流在源和 t运行sformations 之间所做的事情的数量是有限的。因此,数据流越不复杂,它的效率就越高 运行.
- 在内存受限的系统中,这对您意味着什么:
- 同时限制包数运行ning
- 限制一个包中并发的数据流数量运行
- 作为最佳实践,数据流中只有 一个源和一个目标
- 保持数据流简单。使用它们将数据从一台服务器移动到另一台服务器。使用 SQL 进行 运行 信息化工作。使用暂存 tables 来登陆您的数据,然后在将其加载到最终 table 之前对其进行操作。即使您没有执行任何 t运行 转换,使用 SQL 和
WHERE NOT EXISTS
子句加载 table 仍然会更有效。 - 一旦您简化了数据流,但您仍然看到性能不佳,隔离瓶颈。 运行 仅包含源的数据流,看看需要多长时间。如果速度很慢,请调整源查询。将后续任务添加到数据流并测量性能。如果您只是目标缓慢的一步,请调整它。
- 要调整目标,请尝试使用没有索引的分段table。使用
TABLOCK
将告诉 SQL 使用最少的日志记录。实施暂存模式后,调整 SQL 以将数据加载到最终 table. - 为了调整源代码,避免使用视图,因为它们可能包含您不使用的不必要的连接和列,或者使用专用于您的流程的视图,以便它可以正是为您所需要的而写的。如果涉及很多 tables,proc 总体上可能是更好的选择 - 在将数据加入最终最大的 table 之前,使用临时 tables 暂存数据可以提高性能对于 select.
- 不要在生产中使用
WITH (NOLOCK)
提示。 如果数据在您阅读时实际上正在更新,您会想要您的数据在加载之前获得这些更新,不要介意幻读和其他可能发生的可怕事情。