本文介绍了数据库增量更新的五种方法:时间戳增量(两种)、触发器、全表对比(MD5和指定字段)及日志分析。按同步性能排序为时间戳>日志解析>触发器>全表比对;按配置复杂度排序为全表比对<日志解析<触发器<时间戳;按易维护性排序为触发器>日志解析>时间戳>全表比对;按系统影响排序为日志解析<时间戳<全表比对<触发器。这些方法各有优缺点,适用于不同的场景和需求。
摘要生成于
,由 DeepSeek-R1 满血版支持,
1、增量更新的几种方式
增量更新的本质,其实是获取源表中数据变化的情况(增、删、改),然后将源表中发生的变化同步至目标表中。
不同的方式,获取源表中数据变化的情况不一样,受技术的限制、表结构的限制,某些方式可能无法获取到完整的数据变化情况,因此只能适用于特定的场景。
|
方式
|
简述
|
适用场景
|
详述
|
优点
|
缺点
|
|
时间戳增量1
|
记录每次读数完成时的最大时间戳,后续读数时只获取源头表中新增的数据,将其增量写入到目标表。
|
-
源表只增不删不改
-
源表有时间戳标记新增的数据
|
-
第一次从源头表读取数据的动作完成之后,记录一下时间戳字段中最大的时间点,保存到一个记录表中。
-
第二次从源头表读取数据之前,先获取记录表中最后/最大的时间点,只读取源表中这个时间点以后的数据。
-
当加载过程全部成功完成之后再更新加载记录表,更新这次最后的时间点。
|
性能好
|
|
|
时间戳增量2
|
通过时间戳获取源头表新增和修改的数据,然后将其写入到目标表。
|
-
源表只增、改,不删
-
源表有时间戳标记新增和变化的数据
|
-
从源头表首次完成取数后,记录最大的 UpdateDate 时间戳,保存到一个记录表中。
-
第二次读数时,用记录表中的时间戳与源表里的 UpdateDate 时间戳相比较,比时间戳大的说明是源头表中新添加的或者修改的数据。对这部分数据进行取数。
-
从源头表取数完成后,更新最大的 UpdateDate到记录表中。
-
后续取数的逻辑,以此类推。
-
增量抽取时,抽取进程通过比较上次存档的时间与抽取源表的时间戳字段的值来决定抽取哪些数据。这种方式需要在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。
-
有的数据库(例如Sql Server)的时间戳支持自动更新,即表的其它字段的数据发生改变时,时间戳字段的值会被自动更新为记录改变的时刻。在这种情况下,进行ETL实施时就只需要在源表加上时间戳字段就可以了。对于不支持时间戳自动更新的数据库,这就要求业务系统在更新业务数据时,通过编程的方式手工更新时间戳字段。
-
使用时间戳方式可以正常捕获源表的插入和更新操作,但对于删除操作则无能为力,需要结合其它机制才能完成。
|
性能尚可,能够获取改动的源头数据
触发器为抽取的表建立触发器,一般要建立插入、修改、删除三个触发器,源头表的数据发生变化时,触发器将变化的数据写入临时表,抽取线程再从临时表中抽取数据。所有场景
-
该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除。
-
为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称、更新的关键字值和更新操作类型(insert、update或delete),ETL增量抽取进程首先根据源表名称和更新的关键字值,从源表中提取对应的完整记录,再根据更新操作类型,对目标表进行相应的处理。
性能好
覆盖场景全面
成本高,需要建触发器全表对比(MD5)为源头表建立一个结构类似的MD5临时表,每次抽数时对源头表和MD5临时表进行MD5校验码比对,从而决定源头表中的数据是新增、修改还是删除,同时更新MD5校验码。所有场景
-
全表比对即在增量抽取时,ETL进程逐条比较源表和目标表的记录,将新增和修改的记录读取出来。
-
优化之后的全表比对方式是采用MD5校验码,需要事先为要抽取的表建立一个结构类似的MD5临时表,该临时表记录源表的主键值以及根据源表所有字段的数据计算出来的MD5校验码,每次进行数据抽取时,对源表和MD5临时表进行MD5校验码的比对,如有不同,进行update操作:如目标表没有存在该主键值,表示该记录还没有,则进行insert操作。然后,还需要对在源表中已不存在而目标表仍保留的主键值,执行delete操作。
覆盖场景全面需要全表对比,性能差全表对比(指定字段)对比目标表和源头表的几个关键字段,获取源头表和目标表不一致的数据,然后增量写入到目标库。所有场景
-
由用户来选择几个字段,可以作为唯一标识。
-
每次抽数时,对比一下源头表和目标表中这几个字段的差异,来判定表中数据是否存在增、删、改的情况。
-
将源头表变化的数据同步至目标表中。
覆盖场景全面需要对比大量字段,性能差分析日志通过分析数据库自身的日志来判断变化的数据。所有场景
该方式通过分析数据库自身的日志来判断变化的数据。关系型数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增量抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。
有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMiner),使数据库日志的分析工作得到大大简化。
性能好数据库权限问题,未必能够提供日志分析权限
2、各种方式的差异排序
按同步性能由高到低排序依次为: 时间戳 > 日志解析 > 触发器 > 全表比对
按配置复杂由低到高排序依次为: 全表比对 <日志解析 < 触发器 < 时间戳
按易维护性由高到低排序依次为: 触发器 > 日志解析 > 时间戳 > 全表比对
按系统影响由低到高排序依次为:日志解析 < 时间戳 < 全表比对 < 触发器
备注:基于目前研究的结果,增量更新仅适用于明细数据的读写场景,不适用于包含单表计算、多表关联的场景,原因是获取的数据并不是全量数据。
多维分析是指使用
数据
的场景,查询时组合维度属性和指标,输出特定组合维度下的指标值。
数
仓
的基本要求是提供多维分析能力。即对于高度聚合的
数据
可以快速获得结果,例如查看过去一年的去重用户
数
。
多维分析是从使用者角度看
数
仓
应该提供的能力,而OLAP系统是指具有多维分析能力的系统,相对立的概念是OLTP系统,提供的能力是即时查询。
例如常见的.
现在是国内凌晨3点,为了抵挡睡意,还是写写
技术
博客。今天和大家讨论下大
数据仓库
中的
更新
技术
。
当前很多大
数据
技术
,如HDFS最早设定的是
数据
不
更新
,只
增量
叠加。传统
数据仓库
(Greenplum,treadata,oracle RAC)通常碰到两个问题:
1、
更新
的throughput不高。主要影响原因有两点,锁的原因,...
//处理bz_connection(XYB,修改于2016.09.22)
//先查原先文章所属栏目
$result = Db
:
:
name('bz_connection')->alias('con')
->field('`con`.`weiba_id`')
->join('weiba wb', 'con.weiba_id=wb.weiba_id','left')
->where("wb.u
select a.* from 库1(原始
数据
层).表1 a
left outer join 库2(资源层).表1 b
on a.id = b.id where b.id is null;
然后根据分区字段 加载入新的分区
insert overwrite table 资源库.资源表(PARTITION(l...
1.同步
方式
:
1>.直连同步,jdbc
方式
适合操作形业务系统
数据
同步。但是这种
方式
对
数据库
的性能影响较大,一般可以采取主备策略,从备库抽取
数据
。sqoop、datax
2>.
数据
文件同步,通过约定好的编码格式、大小等从源系统生成txt文件,通过ftp传输等
方式
加载到目标
数据库
。为保证文件同步的安全性和准确性,可以考虑源系统增加压缩和加密到目标系统解密和解压缩的
方式
。
3>.日志binlog同步,实现实时同步。性能好,效率高
我们单位(简称单位A)写的应用系统在另外一个单位(简称单位B)部署了多年,一直到2016年年底我们都在给单位B进行应用系统
更新
。但是从2017年年初到现在一直没有
更新
过,最近单位B提出要使用我们开发的新功能,希望我们能够将应用系统最后一次
更新
到现在的所有增加的功能都
更新
一下。
除了功能模块,我们的应用系统中还有模板管理、定制功能,模板的结构如下:
可以定制多种模板,
假设现在有两个表,stg_table和ods_table,两者字段一模一样(建表语句如下)。我们现在需要将stg表中的
数据
增量
插入到ods中去。
create table stg_table(col1 varchar(5),col2 int,col3 int);
create table ods_table like stg_table;
insert into stg_table values ('a',1,1),('c',3,3);
insert into ods_table values ('a',1