开篇介绍

在 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 博客推荐栏中快速看到这些文章。

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

  1. 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

    开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...

  2. 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据

    开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...

  3. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

  4. 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

    开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使 ...

  5. 微软BI 之SSIS 系列 - 再谈Lookup 缓存

    开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache ...

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

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

  7. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  8. 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧

    案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件 ...

  9. 微软BI 之SSIS 系列 - Lookup 中的字符串比较大小写处理 Case Sensitive or Insensitive

    开篇介绍 前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 C ...

随机推荐

  1. Javascript中类的实现机制(四)

    一:  理解类的实现机制 在JavaScript中可以使用function关键字来定义一个“类”,如何为类添加成员.在函数内通过this指针引用的变量或者方法都会成为类的成员,例如:function ...

  2. Gitlab库已损坏前端显示500错误解决方法

    1.问题起因 办公网机房意外断掉,导致gitlab库文件损坏.开发打开gitlab显示500 2.查看日志 命令查看:gitlab-ctl tail 或者手动查看:/var/log/gitlab/gi ...

  3. python小知识-属性查询优先级(如果有同名类属性、数据描述符、实例属性存在的话,实例>类>数据描述符)

    https://www.cnblogs.com/Jimmy1988/p/6808237.html https://segmentfault.com/a/1190000006660339 https:/ ...

  4. zstu-4243 牛吃草

    贴一发两圆相交面积模板 #include<bits/stdc++.h> #define pi acos(-1.0) using namespace std; ; double _abs(d ...

  5. BZOJ3198 [Sdoi2013]spring 哈希 容斥原理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3198 题意概括 有n(1<=n<=100000)组数据,每组数据6个数. 现在问有几对 ...

  6. 【Java】 剑指offer(56-2) 数组中唯一只出现一次的数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次. ...

  7. 018 spark on yarn (Job history)的配置,主要是yarn处跳转到历史聚合页面

    一:目标 1.目标 在yarn的8080页面可以跳转到spark的日志18080页面. 因为在运行spark之后,看对应的job的日志,这样直接连接,更合理直接. 2.总结 在后面可以看到,其实不需要 ...

  8. Linux proc目录下 几个系统文件下的各项参数 (cpuinfo,uptime,meminfo,stat,loadavg)

    参考链接: Linux 操作系统内核基本实验.pdf http://max.book118.com/html/2015/0919/25787869.shtm Linux下cpuinfo文件各项参数的详 ...

  9. 008.Docker Flannel+Etcd分布式网络部署

    一 环境准备 1.1 Flannel概述 Flannel是一种基于overlay网络的跨主机容器网络解决方案,即将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发 ...

  10. 一道有意思的多线程面试题 C# 代码实现

    如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助.鼓励先自己动手实现一遍,做不出来在看代码. 题目一:两个线程交替打印0~100的奇偶数 这道题就是说有两个线程,一个名为偶数线程 ...