在构建数据仓库的ETL过程中,增量数据抽取是一个比较关键的环节。一般情况下需要满足以下两点:
- 数据的准确性,能够将业务系统中的数据按一定的频率准确的抽取到数据仓库中;
- 性能要求,不能对业务系统造成太大的压力,影响现有业务。
目前,实现增量数据抽取最常用的方式有三种:
- 时间戳;
- 变化数据捕捉,Change Data Capture(CDC);
- 全表扫描
上述三种方式各有优劣,用的比较多的可能是几种方式混合使用。
- 时间戳
时间戳使用业务表中某一字段做为判断新旧数据的依据,该字段可以是时间类型,也可以是int型。使用该种方式存在以下问题:
- 无法捕获对时间戳以前数据的delete和update操作,在数据准确性上受到了一定的限制,而实际业务中delete和update的操作还比较普遍;
- 要求业务系统的表必须有一个可以标识新旧数据的列,而某些表没有设置这种列。
2. 全表扫描
全表扫描是使用数据仓库中的当前表与业务系统表进行对比,取得变化了的数据,典型的是使用minus语句:
SELECT * FROM new_version MINUS SELECT * FROM old_version;
使用全表扫描存在以下问题:
- 需要将业务系统中表全部转输,造成很高的网络负载;
- 需要对两版本的表进行全表扫描,性能代价非常高;
- 无法反映数据的历史状态,如无法捕捉库存的历史变化记录。
3. Change Data Capture(CDC)
Oracle的CDC是在Oracle9i新特性中引入的,使用内部触发器或对日志文件的分析发现变化了的数据,并通过订阅/分发的形式(类似于SQL SERVER的分发/订阅)提供给使用者。这些变化了的数据包括insert、delete和update的数据。
CDC分同步和异步两种模式,同步是使用数据库内部的触发器捕捉变化数据,基本做到实时数据;异步是通过分析日志记录得到增量数据信息,有一定延迟,同时提供Stream技术。同步在企业版和标准版中都可以使用,而异步只能在企业版中使用。
CDC异步模式,根据实现机制的不同又可以分为Autolog和Hotlog模式,Autolog通过database's redo transport services传输日志redo log信息,然后在一个独立于source database的staging database内进行日志分析;而Hotlog是在source database进行日志分析的。看得出两者对source database所产生的压力差别。
异步Hotlog模式又可分为异步Hotlog CDC模式和异步分布式Hotlog CDC模式,二者的区别在于异步Hotlog CDC模式在source database建立change set、change tables和执行订阅;而异步分布式Hotlog CDC通过stream技术分发,在staging database建立change set、change tables和执行订阅。
下面列出上面讲到的几种CDC模式:
- Synchronous CDC(同步CDC);
- Asynchronous Autolog CDC(异步Autolog CDC);
- Asynchronous Hotlog CDC(异步Hotlog CDC);
- Asynchronous Distributed Hotlog CDC(异步分布式Hotlog CDC)
Synchronous CDC(同步CDC)
Asynchronous Autolog CDC(异步Autolog CDC)
Asynchronous Hotlog CDC(异步Hotlog CDC)
Asynchronous Distributed Hotlog CDC(异步分布式Hotlog CDC)