【问题标题】:How can I delete the columns in DataFlow Task in SSIS?如何在 SSIS 中删除数据流任务中的列?
【发布时间】:2017-03-08 19:54:23
【问题描述】:

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

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

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

【问题讨论】:

  • 您的目标只是清理代码还是提高性能?
  • @MarkWojciechowicz:这两个都是我的目标

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议。我想我最终会到达那里,但你为我节省了很多时间。我的情况是我有几个串联的组件都注入一列(HttpResponseCode)。我需要删除/重命名它们以避免使用相同名称的下游问题。 Union All 允许我这样做。 +1
【解决方案2】:

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

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

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

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

【讨论】:

  • 感谢您,只有一个问题:您曾说过“例如,您可以将数据暂存到一个表中并读取两次,而不是使用多播。”您是否真的认为将所有行插入一个暂存表并在另一个数据流中再次读取它们比只有一个带有很多列的长数据流更有效?或者将一组行从一个缓冲区复制到一个数据流中的另一个缓冲区,而不是将整个缓冲区插入硬盘并第二次读取某个字段,这不是更好吗?
  • 一切都是个案,但如果你让我盲注,我会说将数据写入数据库。在小工作单元中思考。它们更容易测试和维护,并且通常性能也更好。这通常是因为您可以利用数据库的优势,并且可以创建性能更好的并行工作流
【解决方案3】:

首先,我认为您的要求不会提供更好的性能,因为数据是从源加载的,然后在使用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
    

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多