如何删除SSIS中DataFlow Task中的列?

时间:2017-03-08 19:54:24

标签: sql-server ssis sql-server-2016 ssis-2016

我使用SQL Server 2016并且我有一个非常忙DataFlow task。在我的DataFlow task中,我出于某种原因使用了Multicast component。在DataFlow中创建新流后,我需要删除新流中的一些列,因为它们没用。

enter image description here

仅仅是为了获取更多信息,我需要这样做,因为我的流程中有超过200列,而我需要的列少于10列。

如何删除SSIS中DataFlow Task中的列?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

您可以采用多种方式:

  1. 如果您可以使用精简列源 创建另一个DataFlow Task(例如:具有特定列的OLEDB命令),那么

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

    Output0Buffer.AddRow()
    Output0Budder.OutColumn = Row.inColumn
    
  3. enter image description here

    1. 添加UNION ALL组件并选择所需的列
    2. 附注:最好测试每个方案的性能并选择更好的

答案 2 :(得分:1)

可以添加某种额外的组件。但是,这绝不会降低复杂性或提高性能。从逻辑上讲,只是考虑一下,您正在添加一个需要维护的附加接口。性能方面,任何消除列的方法都意味着将一组行从一个缓冲区复制到另一个缓冲区。这称为异步转换,更好地描述了herehere。您可以想象复制行的效率低于在适当位置更新行的效率。

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

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

这些指南将引导您走向总体方向,但会针对调整特定性能问题发布更多问题。