SSIS Design2:增量更新
一般来说,ETL实现增量更新的方式有两种,第一种:记录字段的最大值,如果数据源中存在持续增加的数据列,记录上次处理的数据集中,该列的最大值;第二种是,保存HashValue,快速检查所有数据,发现异动的数据之后,只同步更新被修改的数据。
1,记录字段的最大值,使用DateTime记录源数据上次更新的时间,或使用TimeStamp或RowVersion记录上次更新的数值
一般情况下,DBA在设计表时,都会在表中创建LastUpdatedTime字段,数据类型是DateTime 或 DateTime2(7),用于记录数据更新的时间。使用DateTime记录上次更新的时间,要求对数据源进行Update或Insert操作时,都要更新LastUpdatedTime字段为当前的时间值。
如果创建TimeStamp或RowVersion类型的字段,那么对数据进行Update或Insert修改时,系统会负责维护该字段,保证其值持续增加。
使用这种方式的特点是,对Table中的任意一个column进行Update,都会更新参照值。如果源系统有部分column没有导入ETL,而源系统却频繁更新这些column,那么会导致ETL每次加载的数据,并不是“更新”的数据。
2,保存HashValue,使用CheckSum或Binary_checksum获取HashValue,对更新的数据进行同步操作
如果Table中没有持续增加的Column,那么记录字段最后一次更新的值,将是不可行的。此时,可以使用CheckSum或Binary_checksum等Hash函数快速检查源数据,并将HashValue保存到一个HashTable中(该HashTable有三列:业务键,HashValue,SyncStatus)。如果一个数据行的HashValue 和 HashTable中记录的HashValue 有出入,说明该数据行发生变化。
使用这种方式的特点是:每次都要对数据源进行全部扫描,获取HashValue;比较HashValue,只对异动的数据进行数据同步。由于对源数据进行全部的扫描 和 Hash隐射都会消耗时间,在使用这种方式之前,需要多做测试,监控IO,CPU 和 内存的使用情况。
注意:只对ETL需要的Columns进行Hash 映射,保存HashValue。即使源Table的其他columns发生update,ETL也不会认定该数据行发生变化。
3,使用HashValue,将源数据分批导入ETL进行处理
如果对源数据的处理非常耗时,那么可以将源数据分批导入ETL,增加数据处理的并行度,以减少ETL的执行时间。
HashTable有三列:业务键,HashValue,SyncStatus,用以记录上次更新时源数据的HashValue
Step1,扫描源数据,获取HashValue,对于同一个数据行,如果当前的HashValue跟HashTable中记录的HashValue不同,那么设置SyncStatus=0;ETL要处理的全部数据,其SyncStatus=0。
Step2,将处理流程复制为N个Batch,将HashValue/N=0,1,2,,,N-1的数据分别引入对应的N个Batch中,这样,N个batch会同时处理不同的数据。在每个Batch处理完成之后,都会设置SyncStatus=1;
Optional Step3,在一个Batch中,可以使用一个循环,每次只处理 M条数据,并将处理过的数据的SyncStatus设置为1。例如,在10号Batch中,一次循环只处理200条数据,那么这200条数据的特点是:SyncStatus=0,HashValue/N=9。
使用这种设计的场景是:处理数据的Task非常耗时,由于Task是同步的,一个Task在将数据处理完成之前,下游Task必须等待,因此,可以将数据集分为多个不重复的子集同时处理,各个Task都在执行数据处理,提高数据处理的并发度,减少ETL的整体时间。
SSIS Design2:增量更新的更多相关文章
- SSIS 实例 从Ftp获取多个文件并对数据库进行增量更新。
整个流程 Step 1 放置一个FTP Task 将远程文件复制到本地 建立FTP链接管理器后 Is LocalPatchVariable 设置为Ture 并创建一个变量设置本地路径 Operatio ...
- [译]Stairway to Integration Services Level 4 - 增量更新数据
在本文中, 我们说下增量更新数据:即将数据源中更新了的数据替换掉目标表中对应的数据. 更新代码 操作之前我们先把目标表e (dbo.Contact). 的数据改掉 Use AdventureWorks ...
- Package设计2:增量更新
SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 一般来说,ETL实现增量更新的方式有两种,第一 ...
- 谈谈混合 App Web 资源的打包与增量更新
综述 移动 App 的运行环境具有带宽不稳定,流量收费,启动速度比较重要等特点,所以混合 App 如何加载 Web 资源并不是一个新问题.本文目的是总结出一种资源打包下载的思路和方案,并且提供一种打包 ...
- android studio增量更新
一.概述 1.1 概念 增量更新即是通过比较 本机安装版本 和 想要安装版本 间的差异,产生一个差异安装包,不需要从官网下载并安装全量安装包,更不需要将本机已安装的版本下载,而仅仅只是安装此差异安装包 ...
- Android 增量更新(BSDiff / bspatch)
Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...
- 【转载】Unity 合理安排增量更新(热更新)
原帖地址:由于我看到的那个网站发的这篇帖子很大可能是盗贴的,我就暂时不贴地址了.避免伤害原作者 原版写的有点乱,我个人修改整理了下. --------------------------------- ...
- Unity5 如何做资源管理和增量更新
工具 Unity 中的资源来源有三个途径:一个是Unity自动打包资源,一个是Resources,一个是AssetBundle. Unity自动打包资源是指在Unity场景中直接使用到的资源会随着场景 ...
- [转载]BW增量更新的理解(时间戳)
在BW中,存在两种数据抽取方式,完全更新与增量更新,完全更新是每次把截至到某个时间的数据全部抽取,增量抽取则只抽取上次和本次抽取之间更新的数据,很显然,增量抽取能够提高系统效率,根据SAP帮 助的说法 ...
随机推荐
- iOS 检测状态栏点击事件
当tableView.scrollsToTop=YES不管用时,可以使用以下方法实现点击状态栏使tableView滚动到顶部. - (void) touchesBegan:(NSSet *)touch ...
- c#接口与抽象类的区别
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...
- 【填坑】bzoj3224 splay裸题
人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ...
- CEF中select选项错位的解决方法
使用cef加载页面,移动窗口后选项的位置并不会变化,仍保持上次打开的位置. 经过google查找到这是一个已经解决了的问题:https://bitbucket.org/chromiumembedded ...
- nodejs 单元测试
之前项目开发因为改进度,基本都是粗放式开发.为了提高代码质量,单元测试是必不可少的. 针对restful api ,用supertest 测试框架.针对nodejs,引入mocha 和should 可 ...
- sublime_text_2 ubuntu下无法输入中文 解决方法
参考资料:http://my.oschina.net/wugaoxing/blog/121281 环境配置:ubuntu 14.10 1.保存下述代码为 sublime_imfix.c 文件 /* s ...
- Flume_企业中日志处理
企业中的日志存放_1 201611/20161112.log.tmp 第二天文件变为20161112.log与20161113.log.tmp 拷贝一份flume-conf.properties.te ...
- jQuery代码节选(筛选)
筛选...8.not()<p class="p1">1</p><p class="p2">2</p><p ...
- 2016huasacm暑假集训训练五 J - Max Sum
题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/J 题意:求一段子的连续最大和,只要每个数都大于0 那么就会一直增加,所以只要和0 ...
- Java 中类型转换
int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...