数仓知识07:数据增量更新的几种方式

1、增量更新的几种方式

增量更新的本质,其实是获取源表中数据变化的情况(增、删、改),然后将源表中发生的变化同步至目标表中。

不同的方式,获取源表中数据变化的情况不一样,受技术的限制、表结构的限制,某些方式可能无法获取到完整的数据变化情况,因此只能适用于特定的场景。

方式 简述 适用场景 详述 优点 缺点
时间戳增量1

记录每次读数完成时的最大时间戳,后续读数时只获取源头表中新增的数据,将其增量写入到目标表。

  1. 源表只增不删不改
  2. 源表有时间戳标记新增的数据
  1. 第一次从源头表读取数据的动作完成之后,记录一下时间戳字段中最大的时间点,保存到一个记录表中。
  2. 第二次从源头表读取数据之前,先获取记录表中最后/最大的时间点,只读取源表中这个时间点以后的数据。
  3. 当加载过程全部成功完成之后再更新加载记录表,更新这次最后的时间点。
性能好
  • 不能捕获删除和变化的数据
  • 部分源头表无时间戳字段
时间戳增量2 通过时间戳获取源头表新增和修改的数据,然后将其写入到目标表。
  1. 源表只增、改,不删
  2. 源表有时间戳标记新增和变化的数据
  1. 从源头表首次完成取数后,记录最大的 UpdateDate 时间戳,保存到一个记录表中。
  2. 第二次读数时,用记录表中的时间戳与源表里的 UpdateDate 时间戳相比较,比时间戳大的说明是源头表中新添加的或者修改的数据。对这部分数据进行取数。
  3. 从源头表取数完成后,更新最大的 UpdateDate到记录表中。
  4. 后续取数的逻辑,以此类推。
  1. 增量抽取时,抽取进程通过比较上次存档的时间与抽取源表的时间戳字段的值来决定抽取哪些数据。这种方式需要在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。
  2. 有的数据库(例如Sql Server)的时间戳支持自动更新,即表的其它字段的数据发生改变时,时间戳字段的值会被自动更新为记录改变的时刻。在这种情况下,进行ETL实施时就只需要在源表加上时间戳字段就可以了。对于不支持时间戳自动更新的数据库,这就要求业务系统在更新业务数据时,通过编程的方式手工更新时间戳字段。
  3. 使用时间戳方式可以正常捕获源表的插入和更新操作,但对于删除操作则无能为力,需要结合其它机制才能完成。
性能尚可,能够获取改动的源头数据
  • 不能捕获删除的数据
  • 部分源头表无时间戳字段
触发器 为抽取的表建立触发器,一般要建立插入、修改、删除三个触发器,源头表的数据发生变化时,触发器将变化的数据写入临时表,抽取线程再从临时表中抽取数据。 所有场景
  1. 该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除。
  2. 为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称、更新的关键字值和更新操作类型(insert、update或delete),ETL增量抽取进程首先根据源表名称和更新的关键字值,从源表中提取对应的完整记录,再根据更新操作类型,对目标表进行相应的处理。

性能好

覆盖场景全面

成本高,需要建触发器
全表对比(MD5) 为源头表建立一个结构类似的MD5临时表,每次抽数时对源头表和MD5临时表进行MD5校验码比对,从而决定源头表中的数据是新增、修改还是删除,同时更新MD5校验码。 所有场景
  1. 全表比对即在增量抽取时,ETL进程逐条比较源表和目标表的记录,将新增和修改的记录读取出来。
  2. 优化之后的全表比对方式是采用MD5校验码,需要事先为要抽取的表建立一个结构类似的MD5临时表,该临时表记录源表的主键值以及根据源表所有字段的数据计算出来的MD5校验码,每次进行数据抽取时,对源表和MD5临时表进行MD5校验码的比对,如有不同,进行update操作:如目标表没有存在该主键值,表示该记录还没有,则进行insert操作。然后,还需要对在源表中已不存在而目标表仍保留的主键值,执行delete操作。
覆盖场景全面 需要全表对比,性能差
全表对比(指定字段) 对比目标表和源头表的几个关键字段,获取源头表和目标表不一致的数据,然后增量写入到目标库。 所有场景
  1. 由用户来选择几个字段,可以作为唯一标识。
  2. 每次抽数时,对比一下源头表和目标表中这几个字段的差异,来判定表中数据是否存在增、删、改的情况。
  3. 将源头表变化的数据同步至目标表中。
覆盖场景全面 需要对比大量字段,性能差
分析日志 通过分析数据库自身的日志来判断变化的数据。 所有场景

该方式通过分析数据库自身的日志来判断变化的数据。关系型数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增量抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。

有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMiner),使数据库日志的分析工作得到大大简化。

性能好 数据库权限问题,未必能够提供日志分析权限

2、各种方式的差异排序

按同步性能由高到低排序依次为: 时间戳 > 日志解析 > 触发器 > 全表比对

按配置复杂由低到高排序依次为: 全表比对 <日志解析 < 触发器 < 时间戳

按易维护性由高到低排序依次为: 触发器 > 日志解析 > 时间戳 > 全表比对

按系统影响由低到高排序依次为:日志解析 < 时间戳 < 全表比对 < 触发器

备注:基于目前研究的结果,增量更新仅适用于明细数据的读写场景,不适用于包含单表计算、多表关联的场景,原因是获取的数据并不是全量数据。

参考:

  • ETL实现增量抽取的几种方式 - ligfoo - 博客园 (cnblogs.com)
  • 数据库增量数据的几种方式_shylhd的专栏-CSDN博客
  • 一般数据库增量数据处理和数据仓库增量数据处理的几种策略 - BIWORK - 博客园 (cnblogs.com)

你可能感兴趣的:(数据仓库,数据仓库,数据库,database)