在构建数据仓库的ETL过程中,增量数据抽取是一个比较关键的环节。一般情况下需要满足以下两点:

  • 数据的准确性,能够将业务系统中的数据按一定的频率准确的抽取到数据仓库中;
  • 性能要求,不能对业务系统造成太大的压力,影响现有业务。

  目前,实现增量数据抽取最常用的方式有三种:

  • 时间戳;
  • 变化数据捕捉,Change Data Capture(CDC);
  • 全表扫描

  上述三种方式各有优劣,用的比较多的可能是几种方式混合使用。

  1. 时间戳

  时间戳使用业务表中某一字段做为判断新旧数据的依据,该字段可以是时间类型,也可以是int型。使用该种方式存在以下问题:

  • 无法捕获对时间戳以前数据的deleteupdate操作,在数据准确性上受到了一定的限制,而实际业务中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)

同步CDC

  Asynchronous Autolog CDC(异步Autolog CDC)

异步Autolog

异步Autolog

  Asynchronous Hotlog CDC(异步Hotlog CDC)

异步Hotlog

  Asynchronous Distributed Hotlog CDC(异步分布式Hotlog CDC)

异步分布式Hotlog