SSIS 设计系列:

一般来说,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,使用Hash值

保存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,分批导入

使用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的整体时间。

Package设计2:增量更新的更多相关文章

  1. **app后端设计(10)--数据增量更新(省流量)

    在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...

  2. app后端设计(10)--数据增量更新

    在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...

  3. Package 设计3:数据源的提取和使用暂存

    SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 在使用SSIS Package处理海量数据时, ...

  4. Package设计1:选择数据类型、暂存数据和并发

    SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 一,数据类型的选择 对于SSIS的数据类型,容 ...

  5. 前端遇上Go: 静态资源增量更新的新实践

    前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...

  6. 谈谈混合 App Web 资源的打包与增量更新

    综述 移动 App 的运行环境具有带宽不稳定,流量收费,启动速度比较重要等特点,所以混合 App 如何加载 Web 资源并不是一个新问题.本文目的是总结出一种资源打包下载的思路和方案,并且提供一种打包 ...

  7. SSIS Design2:增量更新

    一般来说,ETL实现增量更新的方式有两种,第一种:记录字段的最大值,如果数据源中存在持续增加的数据列,记录上次处理的数据集中,该列的最大值:第二种是,保存HashValue,快速检查所有数据,发现异动 ...

  8. Kettle中通过触发器方式实现数据 增量更新

    在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...

  9. 测试Kettle在增量更新的时候是否支持级联——不支持(基于mysql)

    由于LZ很像整理一下如何使用Kettle对一张表进行增量更新的时候, 同时实现对数据库中的其他表也可以实现相关的更新操作. 第一种方法想使用触发器,即在相应的hop之间添加SQL脚本step然后在st ...

随机推荐

  1. [翻译] RSKImageCropper

    RSKImageCropper https://github.com/ruslanskorb/RSKImageCropper An image cropper for iOS like in the ...

  2. Linux学习之路-2017/12/25

    三章  命令通配符 .PATH变量 支持多种文本的通配符 通配符                   含义 * 匹配零个或多个字符    ?   匹配任意单个字符 [0-9]   匹配范围内的数字 [ ...

  3. ASP.NET Web Api vs Node.js Benchmark

    http://mikaelkoskinen.net/post/asp-net-web-api-vs-node-js-benchmark ASP.NET Web Api vs Node.js Bench ...

  4. 【转】.net core 一次坑爹的类库打包过程

    自己遇到这个问题,记录一下,原文链接:http://www.cnblogs.com/Hai--D/p/5776463.html. 众所周知,.net core 跨平台类库引用一定要通过nuget获得. ...

  5. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  6. BZOJ 1877 晨跑 拆点费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...

  7. BZOJ2286:[SDOI2011]消耗战(树形DP,虚树)

    Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军 ...

  8. BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)

    Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...

  9. Codeforces 1106 E. Lunar New Year and Red Envelopes 优先队列+dp

    题意大致是Bob新年拿红包,每个红包可以在s-t时间内取,但是取了之后得在d+1时间开始才能继续取红包. 同时他女儿能在m个时间点阻止他取红包,求女儿阻止后Bob取得的w总和最小值. Bob取红包的策 ...

  10. python获取网站http://www.weather.com.cn 城市 8-15天天气

    参考一个前辈的代码,修改了一个案例开始学习beautifulsoup做爬虫获取天气信息,前辈获取的是7日内天气, 我看旁边还有8-15日就模仿修改了下.其实其他都没有变化,只变换了获取标签的部分.但是 ...