增量更新

编辑
文档创建者:夏娃 (超级管理员 )     浏览次数:3160次     编辑次数:11次     最近更新:doreen0813 于 2017-11-20     

目录:

1、增量更新编辑

1.1 增量更新原理
增量更新是指对表中新增加、新删除和新修改的数据进行更新,即将数据库中有变化的数据更新到Fineindex中,并保持以前的数据不变动。增量更新分为:增量增加、增量删除、增量修改。增量更新只更新有变化的数据,因此其更新效率较全量更新有明显的提高。在BI中的增量更新均是在单表更新中实现的。其实现分为三步:
第一步:用sql执行where语句 uptime>上次更新时间(也可以不用参数“上次更新时间”,可自定义一个),将数据库中更新的时间与Fineindex上次更新的时间进行对比,当某条数据在数据库里的更新的时间大于上次更新的时间,便说明该数据是未更新的数据,将它们更新进来即可。
第二步:读取到数据库中表的变化。表的变化分为:增加、删除、修改,通过sql语句首先识别到数据变化的行,再识别变化的类型是哪一种,从而确定属于哪一种增量更新。实现这一步,数据表要满足表中存在主键(唯 一标识)来标识表中的行,同时有字段记录变化的类型。例如对"用户表(A表)"进行增量更新,用户表的主键是UserID;通过对照表(B表)来记录用户表的变化,用ID和Uptype分别记录变化所在的行和类型(用add表示增加,del表示删除,upd表示修改)。此时执行sql语句,where A.ID=B.ID即可找到变化的行,Uptype="add"即找到增量增加的数据。
第三步:将未更新的数据更新到Fineindex中,对于增量增加,增量删除,增量修改在BI中的单表更新中完成的。在单表更新设置界面,选择“首次生成全量,此后增量更新”即进入到增量更新的设置界面。将相应的sql语句分别对应写到对应的增量类型的框中,后台自动执行sql语句,选择相应变化的所在的行执行增加、删除、修改三种操作。
1.2 增量更新界面
打开业务包,点击表。在表设置界面,选择更新设置。如下图,增量更新分为三种类型,可以点击切换三种类型,其中,下方的空框处是写执行增量更新的sql语句。
222
注:增量更新是以行为单位的,增量增加是对Fineindex中的数据表直接添加行,增量删除是直接删除行,增量修改是将Fineindex中的数据中修改的行进行数值更新。
“上次更新时间”与“当前更新时间”均为对比参数,其使用方式是直接单击该参数名即可输入到设置框内,并使用函数将它们从字符串转化为时间类型。“上次更新时间”表示的是上一次更新开始的时间;“当前更新时间”是指本次更新的开始时间;通过两个时间点,将更新的数据圈定到从上次开始更新时到本次更新之间的新数据上,这样每次更新都会以上次的终点为起点进行更新,以保证数据的准确和完整。
注:“当前更新时间”这个参数并不需要强制使用,它是为了防止出现在更新的sql语句查询时,出现插入数据的情况,此时就不易判断该数据是否被更新;使用"当前更新时间"作为下限,可以将查询sql语句时的数据插入放到下次的更新中进行更新,不会出现遗漏或重复插入。
注:如没有上述情况,使用“上次更新时间”即可。下文使用的是双参数的形式。
1.3 增量更新的时间
增量更新的时间,可以单表定时增量更新,也可以随着全局更新进行全量更新。
222
定时设置可参考单表更新

2、使用对照表的增量更新编辑

使用对照表的增量更新,即是使用对照表来记录被更新表的数据变化,对照表放在数据库中即可,一般是通过触发器的形式在数据更新时自动生成的。假设被更新表为A表、对照表为B,B表应包括更新时间(判断是否为未更新数据)、A表的主键(标识A表变化的行)、更新类型(标识更新类型)。
更新案例:
在mysql数据库中,数据样表hr_user表,对该表进行增量更新;对照表为usermodify表。其字段如下图。
hr_user表:
222
给hr_user添加触发器;并到hr_user进行增、删、改操作,得到如下“更新对”
注:此处以mysql为例,触发器写法如下:
增量增加
create trigger ad after insert on hr_user for each row begin insert into usermodify(UserID,uptime,uptype) values(new.UserID,now(),'add');end
增量删除
create trigger del after delete on hr_user for each row begin insert into usermodify(UserID,uptime,uptype) values(old.UserID,now(),'del');end
增量修改
create trigger upd after update on hr_user for each row begin insert into usermodify(UserID,uptime,uptype) values( new.UserID,now(),'update');end
给hr_user添加触发器;并到hr_user进行增、删、改操作,得到如下“更新对照”:
222

将其中hr_user表加入业务包中,而对照表usermodify只记录了hr_user表中的ID、更新时间(uptime)、更新类型 (uptype)。对照表usermodfy不用选入业务包中,放在数据库中即可。从对照表可以看到增加了4、5两个ID的数据,删除去了ID2的数据,修改了ID1的数据。其结果如下图:

222


2.1 增量增加
数据库中表增加了几行数据,更新时将这几行数据更新到Fineindex中该表中。此时sql语句要先执行sql语句将uptype=add且uptime大于上次更新时候的行从数据库表中读取出来。后台执行增量增加,将这几行添加到Fineindex的表中;其语句如下图
SELECT a.* from hr_user a,userModify b where a.UserID=b.UserID and b.upType='add' and b.uptime>str_to_date('上次更新时间','%Y-%m-%d %H:%i:%s')  and b.uptime < str_to_date('当前更新时间','%Y-%m-%d %H:%i:%s')
语句表示,用a表示hr_user(用户表),用b表示userModify(对照表)同时将a表中所有字段均读出来,读出的数据的行是,该行的ID等于b表中类型为“增加”的ID同时更新时间大于上次更新时间。其中uptime字段为在数据库中应为时间类型,srt_to_date为时间类型函数(将其他类型转化为时间类型,在不同的数据库中函数表达示不同,此处以mysql为例)。

222

注:上次更新时间,是直接单击参数名输入,如上图。
注:在3.7的版本中,此处应写成SELECT a.* from hr_user a,userModify b where a.UserID=b.UserID and b.upType='add' and b.uptime>str_to_date('${上次更新时间}','%Y-%m-%d %H:%i:%s')即使用${}将上次更新时间包起来。
点击预览查看,可以看到执行的结果,正是将添加进来的两个数据展示出来。如若执行错误,我们可以通过查看执行的sql来检查。
222
2.2 增量删除
数据库中的表被删除了几行,更新时Fineindex中的该表的这几行要被删除。此时在数据库中表的这几行已不存在了,不存在A.ID = B.ID,此时只需要将被删除的行读出来,满足uptime大于上次更新时间,Fineindex会执行删除命令,将选中的行删除掉即可。其sql语句如下:
SELECT b.UserID from userModify b where b.uptype = 'del' andb.uptime>str_to_date('上次更新时间','%Y-%m-%d %H:%i:%s')  and b.uptime < str_to_date('当前更新时间','%Y-%m-%d %H:%i:%s')
222
由于数据库中该行数据已经被删除,sql取到的是对照表里存储的值;该值所对应的字段被取出来后,会到Fineindex中匹配增量更新表的标识字段;其对应关系是通过字段名一致来匹配的;但如果对照表中的字段名与增量更新的标识字段名不一致;则无法匹配到标识字段,也就无法执行增量删除操作;
注:在此情况,则需要在sql语句中使用“as 对应字段名” 的方式使查询结果与对应字段名一致,完成匹配。如下图:
要增量更新的hr_user表里的标识字段UserID,而对照表里字段名是ID,因而在sql语句中加入 "as UserID",使sql结果集可以匹配上标识字段。 
222

2.3 增量修改
数据库中表有某几行某列的数据被修改了,更新时只更新这几行数据即可。此时数据库表中的ID还是存在的,而且因为是修改而不是增加,无需将数据库中的表读取出来,只需要选定是哪几行,Fineindex直接将修改的数据更新即可。
SELECT a.UserID from hr_user a,userModify b where a.UserID = b.UserID and b.uptype = 'update' and b.uptime>str_to_date('上次更新时间','%Y-%m-%d %H:%i:%s')  and b.uptime < str_to_date('当前更新时间','%Y-%m-%d %H:%i:%s')
222
写好后,点击“立即更新该表”即可开始增量更新。更新完后,预览数据得到结果如下图
222
与预期相同,到此增量更新就结束了。

3、依照自身增量更新编辑

有这一种情况,数据库中的表自带时间,如超市的零售明细表本身就有销售时间,而这个销售时间就是数据库中新增记录的时间,此时可以使用这个表中已有的时间作为uptime对表进行增量更新。自身表同样要求有主键(唯一标识,标识所在行)、更新时间、更新类型。
注:因为只能使用自身作为对照,增量删除是无法进行的(表中的数据被删除,从表本身已读取不到哪些被删除了),因此它只适合进行增量增加和增量修改的增量更新。
更新案例:
样表销售明细表如图:销售单号(主键)、收费、销售时间、uptype;
注:以下按“上次更新时间”的单参数形式进行。
222
图是数据库中增量更新预期的数据。
222
3.1 增量增加
当依据自身增量更新时,就无需因为存在对照表的条件语句 a.UserID=b.UserID;只需将满足uptype=add且自带的时间(销售时间)大于上次更新时间即可。如下图:
SELECT * from 销售明细表 a where a.uptype='add'and a.销售时间>str_to_date('上次更新时间','%Y-%m-%d %H:%i:%s')
将上次更新时间的参数设好。
222
注:依据自身增量更新,依然需要uptype(增加类型)字段作为过滤条件来选择增量增加的行,sql执行选择到行后,Fineindex更新会自动将选择的行读取增加到表中。
3.2 增量修改
同“依据对照表增量更新”的增量修改类似,仅不需要因为对照表而存在的 a.UserID=b.UserID。
SELECT 销售单号 from 销售明细表 a where a.uptype='upd'and a.销售时间>str_to_date('${}','%Y-%m-%d %H:%i:%s')
点击立即更新即可,更新好后如下图
222
与数据库中的数据一致,增量更新完毕。

4、常见问题编辑

增量更新时,增量增加是必选项,增量删除和增量修改是可选项,也就是说不能单独使用增量删除或者增量修改。
做增量更新的表必须有时间戳主键;或者其所在的关系型数据库中有数据变化日志表。
  • Q:为什么你们的增量更新非得要时间戳?
A:增量更新实际上分为两部分工作,增量比对(或者叫增量查询),和增量写入。 增量比对是相对于全量比对(全量查询)而言的,全量比对即根据MDD已有的数据,和新的DS中的整体的数据逐一比对,看缺少哪些条、哪些条改变了、哪些条删除了。增量比对就是利用时间戳或类似功能的主键直接定位到数据,不需要遍历。 增量写入就是MDD中哪里需要增删改,就在哪里增删改。全量写入是先把过去的数据抹去,然后重写一遍。
  • Q:我用别的工具的时候,也可以增量更新,也没有让我设置时间戳,可以自动进行增量更新,是不是你们这一块技术比较弱?
A:没有时间戳作为依据,从原理上不可能进行增量比对,只能进行全量比对。即使这个功能号称“增量更新”,也只是增量写入,而不是真正的增量更新。 对于真正的增量更新而言,为了达到最佳的速度,增量比对和增量写入都是需要的。当源数据库压力或网络传输速度成为主要性能瓶颈时,增量比对就显得尤其重要;而当BI服务器软硬件性能成为主要瓶颈时,增量写入就变得相对重要。在实际应用中,往往第一种瓶颈更为常见且更难被解决。所以针对实际应用而言增量比对比增量写入更为重要。 也就是说,那些没有变化日志表、没有时间戳的工具做增量更新,在大数据情况下的实际环境中,性能往往都比较差。


附件列表


主题: 数据配置
标签: 暂无标签 编辑/添加标签
如果您认为本文档还有待完善,请编辑

文档内容仅供参考,如果你需要获取更多帮助,请咨询帆软技术支持
关于技术问题,您还可以通过帆软论坛获取帮助,论坛上有非常多的大神,有些水平比帆软工程师还要高哦。
若您还有其他非技术类问题,可以联系帆软传说哥(微信ID:frbiaoge)

本文档是否有用?
谢谢! 我们非常感谢您的反馈。
提交反馈: