1、增量更新的几种方式
增量更新的本质,其实是获取源表中数据变化的情况(增、删、改),然后将源表中发生的变化同步至目标表中。
不同的方式,获取源表中数据变化的情况不一样,受技术的限制、表结构的限制,某些方式可能无法获取到完整的数据变化情况,因此只能适用于特定的场景。
方式 | 简述 | 适用场景 | 详述 | 优点 | 缺点 | |
---|---|---|---|---|---|---|
时间戳增量1 |
记录每次读数完成时的最大时间戳,后续读数时只获取源头表中新增的数据,将其增量写入到目标表。 |
|
|
性能好 |
|
|
时间戳增量2 | 通过时间戳获取源头表新增和修改的数据,然后将其写入到目标表。 |
|
|
性能尚可,能够获取改动的源头数据 |
|
|
触发器 | 为抽取的表建立触发器,一般要建立插入、修改、删除三个触发器,源头表的数据发生变化时,触发器将变化的数据写入临时表,抽取线程再从临时表中抽取数据。 | 所有场景 |
|
性能好 覆盖场景全面 |
成本高,需要建触发器 | |
全表对比(MD5) | 为源头表建立一个结构类似的MD5临时表,每次抽数时对源头表和MD5临时表进行MD5校验码比对,从而决定源头表中的数据是新增、修改还是删除,同时更新MD5校验码。 | 所有场景 |
|
覆盖场景全面 | 需要全表对比,性能差 | |
全表对比(指定字段) | 对比目标表和源头表的几个关键字段,获取源头表和目标表不一致的数据,然后增量写入到目标库。 | 所有场景 |
|
覆盖场景全面 | 需要对比大量字段,性能差 | |
分析日志 | 通过分析数据库自身的日志来判断变化的数据。 | 所有场景 |
该方式通过分析数据库自身的日志来判断变化的数据。关系型数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增量抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。 有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMiner),使数据库日志的分析工作得到大大简化。 |
性能好 | 数据库权限问题,未必能够提供日志分析权限 |
2、各种方式的差异排序
按同步性能由高到低排序依次为: 时间戳 > 日志解析 > 触发器 > 全表比对
按配置复杂由低到高排序依次为: 全表比对 <日志解析 < 触发器 < 时间戳
按易维护性由高到低排序依次为: 触发器 > 日志解析 > 时间戳 > 全表比对
按系统影响由低到高排序依次为:日志解析 < 时间戳 < 全表比对 < 触发器
备注:基于目前研究的结果,增量更新仅适用于明细数据的读写场景,不适用于包含单表计算、多表关联的场景,原因是获取的数据并不是全量数据。
参考:
- ETL实现增量抽取的几种方式 - ligfoo - 博客园 (cnblogs.com)
- 数据库增量数据的几种方式_shylhd的专栏-CSDN博客
- 一般数据库增量数据处理和数据仓库增量数据处理的几种策略 - BIWORK - 博客园 (cnblogs.com)
相关文章
暂无评论...