SSIS的 Data Flow 和 Control Flow

一,Control Flow

在Control Flow中,Task是最小的单元,Task通过Precedence Constraint来保持同步。

1,Control Flow 不能在组件之间传递数据,用于串行或并行执行任务,担当Task的调度者。

如果两个Task之间没有设置precedence constraint,那么这两个Task是并发执行的。在design package时,最大限度地提高task的并发处理能力,能够充分利用server的资源,有助于减少ETL执行的时间。

2,Control Flow 通过Precedence Constraint保持同步

在Task之间设置Precedence Constraint,只有在上游Task执行完成之后,才会执行下游Task;在上游Task执行完成之前,下游Task不会执行。

二,Data Flow

Data Flow 由三部分组成:源,转换和目的,用于处理数据,对数据进行转移(源提取数据和目标加载数据)和转换。

数据流具有流的特性,数据以流的形式并发处理,数据不是一次性全部加载,而是划分为不重复的多个部分,组成一个流,源源不断地从上游组件流向下游组件。在数据流动的过程中,Data Flow的所有组件同时对Data进行处理。上游组件处理完一批Data之后,交接给下游组件继续处理,同时,上游组件继续处理下一批数据。数据在组件之间流动,各个组件同时处理数据的不同部分,直到全部数据处理完成。

Data Flow具有反馈和自动调节的功能,如果下游组件的处理速度存在压力,那么SSIS将会向上游施加反向压力,自动调节,使上游的数据流动速度减缓。

1,内存缓存区结构

数据流使用内存暂时存储数据源中的数据,这意味着,将数据从源提取到SSIS Engine时,Data会存储在预先分配好的内存缓存中,可以根据data row的宽度(一个row中所有column的字节数),设置DefaultBufferMaxRows属性来调整缓冲区的大小,或直接设置DefaultBufferSize属性。

Data Flow Task的属性

SSIS Engine根据Server的资源和压力,会预先分配一组缓冲区,每一个缓冲区存储完整数据集的一个不重复子集。当对数据流进行转换时,SSIS Engine 后台使用一种更为有效的方式:对同一个缓冲区,逐个应用转换组件的业务逻辑,这比将更改后的数据复制到另一个缓冲区,然后应用转换组件的业务逻辑更为有效。不过,有些情况下,SSIS Engine需要复制缓冲区,甚至需要拦截数据流,对整个数据集进行数据转换,例如,聚合和排序。

2,转换的阻塞性:非阻塞(流),半阻塞和阻塞

  • 非阻塞说明:数据是立即从管道中传递到下游,
  • 半阻塞说明:将数据增加到一定数量后再向下游传递,
  • 阻塞说明:接收完全部数据后再向下游传递

大多数转换都是流性的,这意味着在转换逻辑应用到某一行时,不会阻止数据移动到下一个转换。

3,转换的同步和异步输出

每一种转换都有输入和输出,如果输入所使用的缓冲区和输出所使用的缓冲区不一样,那么转换的输出就是异步的,换句话说,许多转换不能够既执行指定操作又维护缓存区(行数或者行的顺序),所以必须复制数据,以实现所期望的结果。

在转换组件的Advanced Editor中,每个column存在一个LineageID属性,这是一个指向缓冲区的指针,标识该列在缓冲区中的位置。

Specifies the lineage ID of the output column when this item was first placed in the data flow.

三,异步转换输出示例

异步转换输出是指,转换的输入缓冲区和输出缓冲区不同。

1,Data Flow

2,Data Source组件

Data Source 具有External columns和 output columns。

External columns直接来源于数据源,Data Source 组件创建缓冲区,将数据复制到缓冲区中,分配LineageID,这个缓冲区就是Data Source 组件的输出。

3,Sort 组件

Sort组件的Input Columns,ID 列的LineageID是197,和Data Source 输出缓冲区中ID 列的LineageID属性相同,这说明,Sort 转换直接使用Data Source的输出缓冲区。

Sort 转的输出,ID列的LineageID属性值是 288。相同的列之所以存在不同的LineageID值,是因为Sort转换的输出是异步的,输入缓冲区和输出缓冲区不同,因此输出需要一个新的列标识符。

SortColumnID属性值是197,是输出列的源列。SortColumnID属性 Specifies the lineage identifier of the input column that is associated with this output column。

所有具有半阻塞性和阻塞性的转换都是异步输出的,这些转换不会直接向下游传递输入缓冲区,因为需要拦截数据以进行处理和重组。

四,同步转换输出示例

属性IdentificationString用于标识组件的数据流,其值是有特定格式的字符串,例如: Conditional Split.Inputs[conditional Split input]

属性SynchronousInPutID 用于标识组件的输出流的IdentificationString,如果组件的属性SynchronousInPutID为None,说明组件会创建新的输出流,转换输出是异步的,如果组件的属性SynchronousInPutID 是一个IdentificationString,说明组件的输出和输入使用相同的缓冲区。

1,Data Flow

2,Conditional Split组件

查看Conditional Split组件的输出,发现case1 没有Output Columns

点击Case1,查看属性SynchronousInPutID,值是Conditional Split.Inputs[conditional Split input]。

查看 Conditional Split的 输入流,查看属性IdentificationString的值,和组件的输出流Case1的SynchronousInPutID属性值相同。

3,验证LineageID值

查看Sort组件的Input Columns,ID的LineageID是 197,和DataSource组件的输出流,Conditional Split的输入流都相同,说明Conditional Split没有创建新的数据缓冲区,使用的是Data source 创建的缓冲区来进行数据转换。

结论:在同步转换输出中,当完成了转换逻辑之后,会立即将缓冲区传递到下游的转换,即转换输入和转换输出使用相同的缓冲区,避免复制缓冲区到输出,因此相同列的LineageID是相同的。

五, 识别转换的异步性

通过Advanced Editor,查看Output的SynchronousInPutID属性,Specifies the input ID of rows in this output

如果SynchronousInPutID属性值为None,那么该组件输出是异步的,如果该值不是None,而是IdentificationString 格式的字符串,那么该转换输出是同步的。

六,数据流缓冲区的申请和释放

Data source 组件会创建新的缓冲区,并为响应的Column分配LineageID值。当缓冲区数据被加载到destination之后,destination会释放缓冲区。

时间: 2024-10-10 10:50:03

SSIS的 Data Flow 和 Control Flow的相关文章

关于Control flow

1.一个package包含一个control flow并且一个或多个data flow. (这个项目叫做 Integration services project,提供了三种不同类型的control flow 元件) 1.1 containers(provide structures in packages) 1.2 tasks(provide functionality) 1.3 precedence constraints (connect the executables, containe

《CS:APP》 chapter 8 Exceptional Control Flow 笔记

Exceptional Control Flow The program counter assumes a sequence of values a0,a1,...,an?1 where each ak is the address of some corresponding instruction Ik. Each transition from ak to ak +1 is called a control transfer. A sequence of such control tran

《CS:APP》 chapter 8 Exceptional Control Flow 注意事项

Exceptional Control Flow The program counter assumes a sequence of values a0,a1,...,an?1 where each ak is the address of some corresponding instruction Ik. Each transition from ak to ak +1 is called a control transfer. A sequence of such control tran

[译]Stairway to Integration Services Level 9 - Control Flow Task Errors

介绍 在本文中,我们会实验 MaximumErrorCount和ForceExecutioResult 故障容差属性,并且还要学习Control Flow task errors, event handlers 和 containers 的联系 关于 SSIS Task Errors 打开 Precedence.dtsx 包. 你的Control Flow 显示如下: 图 1 再做测试前我们先调整两个优先约束.   Script Task 4 和 Script Task 3  调整如下: 图 2

Java程序代写代做|代写JAVA代码|帮做java编程: Control Flow Oriented Coverage Test Procedures

Task: Control Flow Oriented Coverage Test ProceduresIn the so-called branch coverage test, the test case quantity for a Program P be compiled so that each edge of the control flow graph of P (see, for example, Fig. 1: You already know an equivalent r

Exceptional Control Flow(1)

different levels of ECF: In general, we refer to these abrupt changes as exceptional control flow (ECF). Exceptional control flow occurs at all levels of a computer system. For example, at the hardware level, events detected by the hardware trigger a

Conditionals and Control Flow

Part 1: if and else Statements 1. Comparisons operators > Greater than < Less than <= Less than or equal to >= Greater than or equal to == Equal to != Not equal to 2. if Statements Now let's see how we can use comparisons to ask yes or no ques

Control Flow

[Control Flow] 1.for loop中的元素可以省略: 2.for initializer中的变量只能在循环内使用. 3.if.else if.else的用法: 最后一个else可选. 4.switch用法: 5.range match: 6.tuple作为case: 7.value绑定: 8.使用where来增加条件限制: 9.fallthrough关键字: 9.label statement用于for或while的前面,当多个for或while嵌套时,常常需要指跳转到哪: Co

The Swift Programming Language-官方教程精译Swift(6)控制流--Control Flow

Swift提供了类似C语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有控制流程跳转到其他代码的break和continue语句. 除了C里面传统的 for 条件递增循环,Swift 还增加了 for-in 循环,用来更简单地遍历数组(array),字典(dictionary),范围(range),字符串(string)和其他序列类型. Swift 的 switch 语句比 C 语言中更加强大.在 C 语言中,如果某个