3

我用SQL Server 2016而且我很忙DataFlow task。在我的DataFlow task中,我Multicast component出于某种原因使用。在 my 中创建新流后DataFlow,我需要删除新流中的一些列,因为它们无用。

在此处输入图像描述

只是为了获取更多信息,我需要这样做,因为我的流程中有 200 多个列,而我需要的这些列不到 10 个。

如何删除DataFlow TaskSSIS 中的列?

4

3 回答 3

2

我相信您可以只将一个数据流路径传递给一个UNION ALL任务,以从该单个数据流中删除列。

获取要从中删除列的单个数据流路径并将其传递给Union All任务。然后打开Union All任务,右键单击要从该路径中删除的列,然后选择删除。

通常我认为应该更改数据源以不发送不需要的列,但您的情况很特殊。多播中的一条路径需要来自源的所有列,而一条路径不需要。

于 2017-03-08T20:06:54.077 回答
1

首先,我认为您所要求的不会提供更好的性能,因为数据是从源加载的,然后在使用MulticastThen The component that will reduce the column number...

您可以通过多种方式执行此操作:

  1. 如果您可以DataFlow Task使用缩减列源创建另一个 (例如:具有特定列的 OLEDB 命令),那就更好了

  2. 您可以添加Script component异步输出(如下图所示)并将特定列添加到输出中,使用 Vb.net 或 C# 脚本映射它们,如下所示:

    Output0Buffer.AddRow()
    Output0Budder.OutColumn = Row.inColumn
    

在此处输入图像描述

  1. 添加UNION ALL组件并选择您需要的列

旁注:最好测试每个场景的性能并选择更好的

于 2017-03-08T20:46:39.717 回答
1

可以添加某种额外的组件。但是,这永远不会降低复杂性或提高性能。想想看,从逻辑上讲,您正在添加一个需要维护的附加接口。性能方面,任何消除列的操作都意味着将一组行从一个缓冲区复制到另一个缓冲区。这称为异步转换,在此处此处进行更好的描述。您可以想象复制行的效率低于就地更新它们。

以下是一些降低复杂性的建议,这反过来又会提高性能:

  • 在源头减少列。 如果您选择的列随后不会以任何方式使用,请从查询中删除它们或从源组件中取消选中它们。以这种方式删除列会将它们从缓冲区中删除,这将占用更少的内存。
  • 减少数据流中的组件数量。很长的数据流很容易创建,测试起来很痛苦,甚至更难维护。数据流需要一个工作单元,即从这里到那里的数据流,中间有一些东西。这就是数据流大放异彩的地方,事实上,它们通过内存限制和最大线程数来保护自己免受复杂性的影响。最好将工作划分为单独的数据流或存储过程。例如,您可以将数据暂存到一个表中并读取两次,而不是使用多播。
  • 使用数据库。 SSIS 既是一种编排工具,也是一种数据移动工具。我经常发现,使用简单的数据流来暂存数据,然后调用存储过程来处理数据,总是胜过一体化数据流。
  • 增加写入数据的次数。这完全违反直觉,但如果您在较小的操作集中处理数据,则运行速度更快且更易于测试。给定一个干净的石板,我通常会设计一个 ETL 来将数据从源写入临时表,执行从临时表到另一个表的清理步骤,可选地,添加一个一致的步骤以将来自不同源的数据组合到另一个表和,最后,加载目标表的最后一步。请注意,每个源都被推送到其自己的目标表,然后利用数据库进行组合。第一步和最后一步设置为快速运行并避免两端锁定或阻塞。
  • 批量加载。当您确保正在进行批量加载时,上一步确实做得很好。这可能是一件棘手的事情,但通常您可以通过在 OLEDB 目标中使用“快速加载”而不使用 oledb 命令来实现。删除索引并重新添加它们比就地加载要快(很少有例外)。

这些指南将使您朝着大方向前进,但请发布更多有关调整特定性能问题的问题。

于 2017-03-09T00:30:04.503 回答