如何删除 SSIS 中数据流任务中的列?
How can I delete the columns in DataFlow Task in SSIS?
我用SQL Server 2016
而且我很忙DataFlow task
。在我的 DataFlow task
中,出于某种原因我使用了 Multicast component
。在我的 DataFlow
中创建新流程后,我需要删除新流程中的一些列,因为它们没有用。
只是为了了解更多信息,我需要这样做,因为我的流程中有 200 多列,而我需要的列不到 10 列。
如何在 SSIS 中删除 DataFlow Task
中的列?
我相信您可以只将一个数据流路径传递给 UNION ALL
任务以从该单个数据流中删除列。
采用要从中删除列的单一数据流路径,并将其传递给 Union All
任务。然后打开 Union All
任务,右键单击要从该路径中删除的列,然后 select 删除。
通常我认为应该更改数据源以不将不需要的列发送出去,但您的情况很特殊。多播中的一条路径需要来自源的所有列,而一条路径不需要。
首先,我认为您所要求的不会提供更好的性能,因为数据是从源加载的,然后在使用 Multicast
时相乘然后 The component that will reduce the column number
...
您可以通过多种方式执行此操作:
如果您可以使用减少列源创建另一个DataFlow Task
(例如:具有特定列的 OLEDB 命令)比较好
您可以添加 Script component
和异步输出 (如下图所示) 并将特定列添加到输出,映射他们使用 Vb.net 或 C# 脚本,如下所示:
Output0Buffer.AddRow()
Output0Budder.OutColumn = Row.inColumn
- 添加
UNION ALL
组件和 select 您需要的列
旁注:最好测试每个场景的性能并选择更好的
您可以添加某种额外的组件。但是,这永远不会降低复杂性或提高性能。想想看,从逻辑上讲,您正在添加一个需要维护的额外接口。在性能方面,任何消除列的操作都意味着将一组行从一个缓冲区复制到另一个缓冲区。这称为异步转换,更好地描述 here and here。您可以想象复制行的效率低于就地更新行。
这里有一些降低复杂性的建议,这反过来又会提高性能:
- 减少源中的列。如果您选择的列
随后没有以任何方式使用,然后将它们从查询中删除
或者从源组件中取消选中它们。以这种方式删除列会将它们从缓冲区中删除,这将占用更少的内存。
- 减少数据流中的组件数量。很长的数据流很容易创建,测试起来很痛苦,维护起来更难。数据流需要一个 工作单元 ,即从这里到那里的数据流,中间有一些东西。这就是数据流大放异彩的地方,事实上,它们通过内存限制和最大线程数来保护自己免受复杂性的影响。最好将工作分成单独的数据流或存储过程。例如,您可以将数据暂存到 table 中并读取两次,而不是使用多播。
- 使用数据库。 SSIS 既是一种数据移动工具,也是一种编排工具。我经常发现使用简单的数据流 暂存数据 ,然后调用存储过程 处理数据 ,总是优于所有-合一数据流。
- 增加写入数据的次数。这完全违反直觉,但如果您以较小的操作集处理数据,它会更快 运行ning 并且更容易测试。给定一个干净的平台,我通常会设计一个 ETL 将数据从源写入暂存 table,执行从暂存阶段 table 到另一个暂存阶段的清理步骤,可选地,添加一个一致性步骤来组合数据从不同的源到另一个 table,最后一步是加载目标 table。请注意,每个源都被推送到其自己的目标 table,然后利用数据库进行组合。第一步和最后一步设置为 运行 快速,并避免在任一端锁定或阻塞。
- 批量加载。当您确保批量加载正在发生时,前面的步骤确实做得很好。这可能是一件棘手的事情,但通常您可以通过在 OLEDB 目标中使用 "fast load" 并使用 oledb 命令通过 never 来实现。删除索引并重新添加它们比就地加载更快(除了少数例外)。
这些指南将引导您朝着大致方向前进,但post 还要提出更多问题来调整特定的性能问题。
我用SQL Server 2016
而且我很忙DataFlow task
。在我的 DataFlow task
中,出于某种原因我使用了 Multicast component
。在我的 DataFlow
中创建新流程后,我需要删除新流程中的一些列,因为它们没有用。
只是为了了解更多信息,我需要这样做,因为我的流程中有 200 多列,而我需要的列不到 10 列。
如何在 SSIS 中删除 DataFlow Task
中的列?
我相信您可以只将一个数据流路径传递给 UNION ALL
任务以从该单个数据流中删除列。
采用要从中删除列的单一数据流路径,并将其传递给 Union All
任务。然后打开 Union All
任务,右键单击要从该路径中删除的列,然后 select 删除。
通常我认为应该更改数据源以不将不需要的列发送出去,但您的情况很特殊。多播中的一条路径需要来自源的所有列,而一条路径不需要。
首先,我认为您所要求的不会提供更好的性能,因为数据是从源加载的,然后在使用 Multicast
时相乘然后 The component that will reduce the column number
...
您可以通过多种方式执行此操作:
如果您可以使用减少列源创建另一个
DataFlow Task
(例如:具有特定列的 OLEDB 命令)比较好您可以添加
Script component
和异步输出 (如下图所示) 并将特定列添加到输出,映射他们使用 Vb.net 或 C# 脚本,如下所示:Output0Buffer.AddRow() Output0Budder.OutColumn = Row.inColumn
- 添加
UNION ALL
组件和 select 您需要的列
旁注:最好测试每个场景的性能并选择更好的
您可以添加某种额外的组件。但是,这永远不会降低复杂性或提高性能。想想看,从逻辑上讲,您正在添加一个需要维护的额外接口。在性能方面,任何消除列的操作都意味着将一组行从一个缓冲区复制到另一个缓冲区。这称为异步转换,更好地描述 here and here。您可以想象复制行的效率低于就地更新行。
这里有一些降低复杂性的建议,这反过来又会提高性能:
- 减少源中的列。如果您选择的列 随后没有以任何方式使用,然后将它们从查询中删除 或者从源组件中取消选中它们。以这种方式删除列会将它们从缓冲区中删除,这将占用更少的内存。
- 减少数据流中的组件数量。很长的数据流很容易创建,测试起来很痛苦,维护起来更难。数据流需要一个 工作单元 ,即从这里到那里的数据流,中间有一些东西。这就是数据流大放异彩的地方,事实上,它们通过内存限制和最大线程数来保护自己免受复杂性的影响。最好将工作分成单独的数据流或存储过程。例如,您可以将数据暂存到 table 中并读取两次,而不是使用多播。
- 使用数据库。 SSIS 既是一种数据移动工具,也是一种编排工具。我经常发现使用简单的数据流 暂存数据 ,然后调用存储过程 处理数据 ,总是优于所有-合一数据流。
- 增加写入数据的次数。这完全违反直觉,但如果您以较小的操作集处理数据,它会更快 运行ning 并且更容易测试。给定一个干净的平台,我通常会设计一个 ETL 将数据从源写入暂存 table,执行从暂存阶段 table 到另一个暂存阶段的清理步骤,可选地,添加一个一致性步骤来组合数据从不同的源到另一个 table,最后一步是加载目标 table。请注意,每个源都被推送到其自己的目标 table,然后利用数据库进行组合。第一步和最后一步设置为 运行 快速,并避免在任一端锁定或阻塞。
- 批量加载。当您确保批量加载正在发生时,前面的步骤确实做得很好。这可能是一件棘手的事情,但通常您可以通过在 OLEDB 目标中使用 "fast load" 并使用 oledb 命令通过 never 来实现。删除索引并重新添加它们比就地加载更快(除了少数例外)。
这些指南将引导您朝着大致方向前进,但post 还要提出更多问题来调整特定的性能问题。