开篇介绍

在 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. 【C语言】字节对齐(内存对齐)

    数据对齐 1.  对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...

  2. Java编程的逻辑 (12) - 函数调用的基本原理

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  3. Eclipse-debug时提示absent line number information的解决办法

    unable to install breakpoint in ...(file name) due to miss line number attributes. midify compliter ...

  4. 【BZOJ4919】[Lydsy六月月赛]大根堆

    题解: 我觉得数据结构写成结构体还是有必要的 因为不然一道题里出现了两个相同的数据结构由于名字很像很容易出错 另外初始化用segmenttree(){ } 首先裸的dp很好想 f[i][j]表示在i点 ...

  5. 练习|Django-单表

    结构目录 页面展示: 1创建Django,创建app01 在modules.py添加 class Book(models.Model): id=models.AutoField(primary_key ...

  6. 001 Spark的简介以及入门

    1.hadoop,spark,Flink的比较 MapReduce: 分布式的计算框架 -> Hive 问题: shuffle:大文件的排序+读写磁盘+网络传输 => 比较慢 只有两种执行 ...

  7. FastAdmin 在 Nginx 中的配置

    FastAdmin 使用的是 ThinkPHP 5 框架. 在 Apache 下很简单,但是在 nginx 下就需要自行配置一下了. 在网上找了很多,都没有找到很好的. 刚刚在 QQ 里群里找到一个, ...

  8. poj 2253 Frogger (最小最大路段)【dijkstra】

    <题目链接> 题目大意: 给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过任意石头到达B,问从A到B多条路径中最小的最长边. 解题分析: 这是最短路的一类典型题目,与普通的最 ...

  9. python爬虫之下载文件的方式总结以及程序实例

    python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...

  10. 附004.Docker Compose环境变量说明

    一 环境变量概述 Compose支持在docker-compose执行命令的文件夹中,名为.env的环境变量配置文件声明默认环境变量. 二 定义变量 2.1 语法规则 Compose建议env文件中的 ...