Sql server 如何在SSIS中删除数据流任务中的列?

Sql server 如何在SSIS中删除数据流任务中的列?,sql-server,ssis,sql-server-2016,ssis-2016,Sql Server,Ssis,Sql Server 2016,Ssis 2016,我使用的是SQL Server 2016,我有一个非常繁忙的数据流任务。在我的数据流任务中,出于某种原因,我使用了多播组件。在我的数据流中创建新流后,我需要删除新流中的一些列,因为它们是无用的 为了获得更多信息,我需要这样做,因为我的流中有200多列,而我需要的这些列不到10列 如何在SSIS中删除数据流任务中的列?我相信您可以只将一个数据流路径传递给联合所有任务,以从单个数据流中删除列 获取要从中删除列的单个数据流路径,并将其传递给Union All任务。然后打开“全部联合”任务,右键单击要

我使用的是
SQL Server 2016
,我有一个非常繁忙的
数据流任务
。在我的
数据流任务
中,出于某种原因,我使用了
多播组件
。在我的
数据流
中创建新流后,我需要删除新流中的一些列,因为它们是无用的

为了获得更多信息,我需要这样做,因为我的流中有200多列,而我需要的这些列不到10列


如何在SSIS中删除
数据流任务
中的列?

我相信您可以只将一个数据流路径传递给
联合所有
任务,以从单个数据流中删除列

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


通常我认为数据的来源应该改变,以避免发送不需要的列,但您的情况是特殊的。多播中的一个路径需要源中的所有列,而另一个路径不需要。

首先,我不认为您所要求的将提供更好的性能,因为数据从源加载,然后在使用
多播
然后
减少列数的组件时相乘

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

  • 如果您可以创建另一个
    数据流任务
    ,使用减少的列源(例如:具有特定列的OLEDB命令),则效果更好

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

    Output0Buffer.AddRow()
    Output0Budder.OutColumn = Row.inColumn
    
  • 添加一个
    UNION ALL
    组件并选择所需的列
  • 旁注:最好测试每个场景的性能并选择更好的

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

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

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

    这些指导原则将使您朝着总体方向前进,但一定要针对具体的性能问题提出更多问题。

    您的目标是清理代码还是提高性能?@MarkWojciechowicz:这两者都是我的目标谢谢,还有一个问题:您已经告诉我了例如,您可以将数据暂存到表中并读取两次,而不是使用多播。“您真的认为将所有行插入一个stage表并在另一个数据流中再次读取它们比只使用一个包含大量列的长数据流更有效吗?”?或者,在一个数据流中,将一组行从一个缓冲区复制到另一个缓冲区,而不是将整个缓冲区插入硬盘,然后第二次读取某个字段,这不是更好吗?一切都是逐案进行的,但如果你让我进行盲注,我会说将数据写入数据库。以小的工作单元思考。它们更容易测试和维护,通常表现也更好。这通常是因为您可以利用数据库获取其擅长的内容,而b