增量是以一个时间段为计量单位,记录该段时间内较以前增加的数据记录。
增量抽取是将该段时间内增长的记录查找出来。
增量抽取一般有三种抽取模式,用于捕获源系统新增的数据到系目标库中
1)、时间戳方式,要求源表中存在一个或多个字段(时间戳),其值随着新纪录的增加而不断增加,执行数据抽取时,程序通过时间戳对数据进行过滤,抽取结束后,程序记录时间戳信息。
2)、触发器方式。要求用户在源数据库中有创建触发器和临时表的权限,触发器捕获新增的数据到临时表中,执行抽取时,程序自动从临时表中读取数据。(这种方式现在觉得挺可取的,这样的话每次进行数据抽取的时候数据就变少了,但是这种方式要求每个表中都建有触发器,而且改动会比较的大,实现起来会比较的麻烦)
3)、全表对比方式,每次从源表中读取所有记录,然后逐条与目标表进行对比,有则插入,没有则放弃。(这种方法从原理上来讲是可行的,但是在实际的操作的过程中是十分的复杂的)
在我从事的ETL工作中,大部分都是采用时间戳方式进行增量抽取,如银行业务,VT新开户,使用时间戳方式,可以在固定时间内,组织人员进行数据抽取,进行整合后,加载到目标系统。
而触发器方式,虽然可以自动进行抽取,但是执行频率过多,影响效率!
第三种方式对于大数据量来说是非常不可取的,尤其是对于一些银行、电信行业,因为数据全量比较大,所以进行增量校对是比较耗时的,总起来说,个人趋向使用时间戳方式进行增量抽取,当然具体情况要看工作的使用环境
4)全表删除插入方式
全表删除插入方式是指每次抽取前先删除目标表数据,抽取时全新加载数据。该方式实际上将增量抽取等同于全量抽取。对于数据量不大,全量抽取的时间代价小于执行增量抽取的算法和条件代价时,可以采用该方式。
5)日志表方式
对于建立了业务系统的生产数据库,可以在数据库中创建业务日志表,当特定需要监控的业务数据发生变化时,由相应的业务系统程序模块来更新维护日志表内容。增量抽取时,通过读日志表数据决定加载哪些数据及如何加载。日志表的维护需要由业务系统程序用代码来完成。
6)系统日志分析方式
该方式通过分析数据库自身的日志来判断变化的数据。关系犁数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增晕抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。有些数据库系统提供了访问日志的专用的程序包(例如ORACLE的LOGMINDER),使数据库日志的分析工作得到大大简化。
以下介绍常见的针对特有数据库系统的增景抽取方式。
7.1 ORACLE改变数据捕获(CHANGEDDATACAPTURE,CDC)方式:ORACLECDC特性是在ORAELE9I数据库中引入的。CDC能够帮助识别从上次抽取之后发生变化的数据。利用CDC,在对源表进行INSERT、UPCLATE或DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给ETL抽取进程,作为增量抽取的依据。CDC方式对源表数据变化情况的捕获有两种方式:同步CDC和异步CDC。同步CDC使用源数据库触发器来捕获变更的数据。这种方式是实时的,没有任何延迟。当DML操作提交后,变更表中就产生了变更数据。异步CDC使用数据库重做日志(REDOLOG)文件,在源数据库发生变更以后,才进行数据捕获。
7.2 ORACLE闪回查询方式:ORACLE9I以上版本的数据库系统提供了闪回查询机制,允许用户查询过去某个时刻的数据库状态。这样,抽取进程可以将源数据库的(BI)当前状态和上次抽取时刻的状态进行对比,快速得出源表数据记录的变化情况。
8、比较和分析
可见,ETL在进行增量抽取操作时,有以上各种机制可以选择。现从兼容性、完备性、性能和侵入性3个方面对这些机制的优劣进行比较分析。数据抽取需要面对的源系统,并不一定都是关系型数据库系统。某个ETL过程需要从若干年前的遗留系统中抽取EXCEL或者CSV文本数据的情形是经常发牛的。这时,所有基于关系型数据库产品的增量机制都无法工作,时间戳方式和全表比对方式可能有一定的利用价值,在最坏的情况下,只有放弃增量抽取的思路,转而采用全表删除插入方式。完备性方面,时间戳方式不能捕获DELETE操作,需要结合其它方式一起使用。增量抽取的性能因素表现在两个方面,一是抽取进程本身的性能,二是对源系统性能的负面影响。触发器方式、日志表方式以及系统日志分析方式由于不需要在抽取过程中执行比对步骤,所以增量抽取的性能较佳。全表比对方式需要经过复杂的比对过程才能识别出更改的记录,抽取性能最差。在对源系统的性能影响方面,触发器方式由于是直接在源系统业务表上建立触发器,同时写临时表,对于频繁操作的业务系统可能会有一定的性能损失,尤其是当业务表上执行批量操作时,行级触发器将会对性能产生严重的影响;同步CDC方式内部采用触发器的方式实现,也同样存在性能影响的问题;全表比对方式和日志表方式对数据源系统数据库的性能没有任何影响,只是它们需要业务系统进行额外的运算和数据库操作,会有少许的时间损耗;时间戳方式、系统日志分析方式以及基于系统日志分析的方式(异步CDC和闪回查询)对数据库性能的影响也是非常小的。对数据源系统的侵入性是指业务系统是否要为实现增抽取机制做功能修改和额外操作,在这一点上,时间戳方式值得特别关注该方式除了要修改数据源系统表结构外,对于不支持时间戳字段自动更新的关系型数据库产品,还必须要修改业务系统的功能,让它在源表T执行每次操作时都要显式的更新表的时间戳字段,这在ETL实施过程中必须得到数据源系统高度的配合才能达到,并且在多数情况下这种要求在数据源系统看来是比较“过分”的,这也是时间戳方式无法得到广泛运用的主要原因。另外,触发器方式需要在源表上建立触发器,这种在某些场合中也遭到拒绝。还有一些需要建立临时表的方式,例如全表比对和日志表方式。可能因为开放给ETL进程的数据库权限的限制而无法实施。同样的情况也可能发生在基于系统日志分析的方式上,因为大多数的数据库产品只允许特定组的用户甚至只有DBA才能执行日志分析。闪回杏询在侵入性方面的影响是最小的。(BI)
各种数据增量抽取机制的优劣性综合分析如表L所示。