开篇介绍

在 SSIS Dataflow 数据流中的组件可以分为 Synchronous 同步和 Asynchronous 异步这两种类型。

同步与异步 Synchronous and Asynchronous

Synchronous 同步组件

同步组件有一个非常重要的特征 - 同步组件的输出和它的输入共享同一个缓存,即输入多少行数据输出就多少行数据。在同步转换的过程中,输入一行,输出一行,输入与输出同步,它们同时发生。

Asynchronous 异步组件

异步组件的特征就是它的输出使用的是一个新的缓存,它不会重用输入的缓存,输出的记录有可能比输入多,也有可能比输入少。在异步转换的过程中,异步组件会要求新的缓存区才会执行处理,比如向 Sort 组件,它必须要在一个操作中处理整个行集。还有像 Merge, Merge Join 等合并操作,组件要先检查各个输入的多个行,然后按照排序好的顺序来合并输入行。包括 Aggregate 组件,它需要新添加一行来保存计算好的聚合值。 
所以这样对比下来,通常情况下同步组件因为可以重用输入的缓存因此要比异步组件要快一些,因为异步组件需要一块新的缓存来完成输出内容。
观察所有的数据源组件,它们都是异步类型,因为它们需要创建两个缓存,一个是成功的输出一个是错误输出,所有的目标 Destination 组件都是同步的。

阻塞,半阻塞和全阻塞 (Non-blocking, semi-blocking and Fully-blocking)

除了上面的两种分类之外,还可以将它们分为这三种类型:Non-blocking 非阻塞, semi-blocking 半阻塞和 Fully-blocking 全阻塞。 

Non-blocking 非阻塞转换

非阻塞转换也被称为行转换,也属于同步转换组件。组件接收到一行数据,对这一行数据处理后再输出。在组件的整个输出处理过程中不新建也不删除数据行。比如从上游 Source 中加载1000条数据,经过非阻塞转换组件的时候,每接收一行数据就处理一行,处理完毕后就直接将这一行数据传递给下游组件,不会等到所有的1000条数据处理完才交给下一个组件。

Semi-blocking 半阻塞转换

半阻塞的意思就是转换组件会控制输入行一段时间,比如组件接收到上游的1000行数据,有可能接收到了10行或者100行数据就汇总一次,最后输出这10行或者100行数据,或者输出一行汇总的数据,所以每次接到一行数据并不会立即处理输出。处理完这批数据输出之后,就可以继续接受其它行数据并处理再输出,半阻塞转换也属于异步转换组件。

Fully-blocking 全阻塞转换

与半阻塞转换相同,都是属于异步转换组件。但是全阻塞转换组件会控制全部数据,上游来了1000行数据,全阻塞组件需要接受完全部的1000行数据之后才会处理输出。比如像 Sort 或者 Aggregate 组件,它们需要接受了所有数据之后才会排序或者聚合,这个是很容易理解的。

SSIS 数据流 Data Flow 组件中的分类

如何理解 Buffer 缓存

Buffer 缓存实际上可以理解为数据流中存储数据的容器,再说简单一点就是一块内存,数据流组件从外部获取数据之后数据就保存在这个 Buffer 容器。一个 Data Flow Task 中可以有多个 Buffer, 并且要理解的是 一个 Buffer 并不是由单个组件独有,而是可以由几个转换组件共享。在整个数据流中,每遇到一个异步输出就会新创建一个 Buffer。
 
看一个示例,这个数据流从 OLE DB Source 组件开始 (OLE_SRC_UserDownload) 开启一个 Buffer 容器,它是异步组件它需要开辟这个新缓存。Multicast 组件 (MC_UserDownload) 与 OLE DB Destination (OLE_DST_UserDownload) 它们是同步组件,因此它们不需要新创建缓存,因此是与它们的输入即 OLE_SRC_UserDownload 共享这个 Buffer,如图所示 Buffer 1 部分。
通过 Multicast 组件,产生了左右两个分支,当遇到 Aggregate 组件 (Aggregate_Count_MaxLoadingTime) 时,因为 Aggregate 组件是一个异步完全阻塞组件,因此需要创建一个新的缓存 Buffer 容器 - Buffer 2。
在 Buffer 2 中,假设通过 Aggregate_Count_MaxLoadingTime 往下产生了两列,那么 Buffer 2 中就定义了这两列,当通过 Derived Column 组件 (DC_CreateAuditColumns) 衍生新的两列时,此时 Buffer 2 就多定义了两列,总共就定义了四列,当所有数据写入 OLE DB Destination 组件之后 Buffer 2 也就结束了。
了解了有关 Buffer 的知识之后,可以打开所在数据流的属性,能看到对当前数据流 Buffer 容器相关属性的配置,比如默认缓存中的最大行数,默认缓存大小。默认缓存大小是10 MB,一个 Buffer 中最大只能处理 100 MB 数据,所以也可以设置成 100 MB,但是如果处理的数据超过100MB数据流就会多建几个 Buffer。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)  如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

转载于:https://www.cnblogs.com/biwork/p/3330115.html

微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念...相关推荐

  1. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

    开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...

  2. 微软BI 之SSIS 系列 - 通过设置 CheckPoints 检查点来增强 SSIS Package 流程的重用性...

    开篇介绍 通常一个 ETL Package 是由多个控制流和数据流共同组成,有的时候 ETL 的步骤可能会比较多,整个流程执行下来的时间可能比较长.假设在 ETL Package 中包含5个Task, ...

  3. 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache...

    开篇介绍 先简单的演示一下使用 Lookup 组件实现一个简单示例 - 从数据源表 A 中导出数据到目标数据表 B,如果 A 数据在 B 中不存在就插入新数据到B,如果存在就更新B 和 A 表数据保持 ...

  4. 微软BI 之SSIS 系列 - 平面文件格式的区别(Delimited,Fixed width,Ragged Right, Fixed width ...)...

    开篇介绍 SSIS 中处理文件,一般在描述输出平面文件格式的时候通常会出现以下几种选项: Delimited - 默认输出列使用逗号分隔,也可以选择其它的诸如 | ,或者 Tab 等. Fixed W ...

  5. 微软BI 之SSIS 系列 - 利用 SSIS 模板快速开发 SSIS Package

    开篇介绍 在做 ETL 项目的时候,往往很多 Package 的开发都是基于相同的模型和流程.比如在 Package 开始运行时需要向 Process Log 表中插入记录,在 Package 运行结 ...

  6. 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project

    SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...

  7. 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题

    微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题 参考文章: (1)微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题 ...

  8. 理解js中的同步和异步

    首先要先了解下js单线程 一.为什么js是单线程? 其实,JavaScript的单线程,与它的用途是有很大关系,我们都知道,JavaScript作为浏览器的脚本语言,主要用来实现与用户的交互,利用Ja ...

  9. 如何理解js中的同步和异步

    首先需要理解:JS是单线程运行的 同步和异步,无论如何,做事情的时候都是只有一条流水线(单线程),同步和异步的差别就在于这条流水线上各个流程的执行顺序不同. 同步就是程序按照正常的执行顺序,依次执行 ...

最新文章

  1. 人工智能从业者应该从哪里去寻找和阅读顶级论文?
  2. ThinkPHP如何判断一个更新操作是否成功
  3. java不抛出方法异常,java – 重写方法不会抛出异常
  4. jsp获取当前时间存入mysql数据库_jsp获取当前时间插入Mysql数据库?
  5. science图表_Science:组合图表绘制
  6. 在CentOS7上安装RocketMQ 4.8.0
  7. archlinux i3wm flameshot使用
  8. 著者四角号码查询_古籍检索史料检索.ppt
  9. C语言dtoc函数,VFP数据库程序设计基础课后作业(二)参考答案(VFP函数表达式练习题--答案)...
  10. 天正电气图例_天正电气设计施工图中常用线路敷设方式
  11. Matlab的一些常用功能
  12. Static Asynchronous Component Misuse Detection for Android Applications
  13. redmi Note12T屏幕刷新率是多少 Redmi Note12T相机怎么样 有几个摄像头
  14. XTP dockingpane的使用方法
  15. 车载以太网协议:SOME/IP (layer5-7)简介
  16. 黑盒测试的原理及内容
  17. [转载]屏蔽双显卡笔记本的独显
  18. Python中jieba库的安装方法
  19. 3055. 字符频率
  20. Android弹出窗口(确定/取消)

热门文章

  1. RabbitMQ各个参数含义
  2. Material Design组件之NavigationView
  3. 客户端程序调用zookeeper报len4807928异常
  4. Java数据类型分类
  5. 17.合并两个排序的链表
  6. Java GUI简单点名器
  7. JAVA正则表达式及常用类
  8. CMMI 项目监督与控制(PMC)
  9. jmstudio 摄像头获取不到_什么是全景摄像头?
  10. delphi 停电文本数据丢失_河南照片数据恢复怎么联系