注册
达梦物化视图怎么实现增量数据实时更新
技术分享/ 文章详情 /

达梦物化视图怎么实现增量数据实时更新

Paige 2022/07/02 2650 1 0

概念

物化视图和普通视图有什么区别?
物化视图实际有个对应的物理表真正存储数据,不需要在查询物化视图时查对应的基表数据而是直接查物化视图表的数据。
和普通视图比较,减少了对基表的访问压力,但存在一个问题,如果物化视图对应的基表数据有更新,物化视图表中的数据就变得陈旧,需要有个策略来保障物化视图的数据同步更新。
而保障这个同步更新,实际是通过创建一些基表日志表、基表触发器、库级触发器来实现同步更新的
如果要使用物化视图,需要在性能和数据实时性之间进行权衡取舍,做合理的设计。

底层实现原理

物化视图怎么来保障数据的同步更新呢?
在创建物化视图时,系统会对应生成一个物理表,物理表对象名是“MTAB$_”+视图对象名,即在创建的物化视图名为V_TEST,同时会对应的创建一个物理表MTAB$_V_TEST;
系统再根据刷新策略来更新这个物理表数据,从而实现数据的同步更新。
刷新策略由三部分组成:刷新方法+刷新时机+刷新规则

刷新方法

3个选项:
FAST:根据相关表上的数据更改记录进行增量刷新,普通DML操作生成的记录存在于物化视图日志。使用FAST刷新之前,必须先建好物化视图日志
物化视图日志表建好后会自动创建一个基表的表级触发器,来记录基表的数据变化,实现增量数据的同步。
例如创建TEST1表的物化视图日志,会对应的创建一个命名为MTRG$_TEST1的表触发器

COMPLETE:通过执行物化视图的定义脚本进行完全刷新
FORCE:默认选项。当快速刷新可用时采用快速刷新,否则采用完全刷新。

刷新时机

2个选项:
ON DEMAND:由用户通过REFRESH语法进行手动刷新。如果指定了START WITH和NEXT子句就没有必要指定ON DEMAND。

ON COMMIT:在相关表上视图提交时进行快速刷新。刷新是由异步线程执行的,因此COMMIT执行结束后可能需要等待一段时间物化视图数据才是最新的

刷新规则

2种可选项
WITH PRIMARY KEY:默认选项,必须含有PRIMARY KEY约束,**视图定义中的选择列必须有基表的PRIMARY KEY **

WITH ROWID:只能基于单表,如果使用WITH ROWID的同时使用快速刷新,则必须将ROWID提取出来,和其他列名一起,以别名的形式显示

应用实践

需求

设计一个物化视图,只查test1表trd_date大于2022-06-01之后的数据,要求其数据实现增量数据实时更新,非全量更新

分析需求

增量数据实时更新,则物化视图的刷新方法应该是FAST,且要先对视图定义中的基表创建日志表;时机为ON COMMIT;规则如果基表有主键一般优先选择WITH PRIMARY KEY,如果没有主键则选择WITH ROWID

先准备测试表和数据:

create table test1(prd_id int not null ,trd_date datetime not null , prd_price dec,primary key (prd_id,trd_date));
insert into test1 
select level, to_char(now()-level,'yyyy-mm-dd') ,dbms_random.value(0,100) from dual CONNECT by level<=1000;
commit;

创建物化视图日志表【物化视图定义中涉及到的基表】

日志表有个选项purge 表示对物化视图日志表中无用记录的清理时机,可选择立即清除也可选择定时清除,以下选择的是立即清除,可看到执行脚本后,对应会产生了一个日志表和基表触发器,以此来实现基表dml操作的捕获和存储

create MATERIALIZED VIEW LOG on test1 purge immediate SYNCHRONOUS;

image.pngimage.png

如果想选择定期清除【从当前时间开始,每隔1天清除一次】可定义如下,会比立即清除多创建个库级触发器来实现日志表的数据定期清理


image.png

创建物化视图
会生成一个物化视图对应的物理表

drop MATERIALIZED VIEW if exists v_test;
create MATERIALIZED VIEW v_test refresh fast on COMMIT with PRIMARY KEY
as  
select * 
from test1 a
where trd_date>='2022-06-01';

image.png

查看物化视图数据

select * from v_test where prd_id=1 ;  

image.png

对应物化视图物理表数据:

select * from MTAB$_V_TEST  where prd_id=1;

image.png

修改基表test1的prd_id=1记录的prd_price=10 观察物化视图表数据是否变化

update  test1 set prd_price=10 where prd_id=1 ;
commit;
select * from v_test where prd_id=1 ; 

image.png

select * from MTAB$_V_TEST  where prd_id=1;

image.png

更多的物化视图定义和使用语法参见:
物化视图 | 达梦技术文档 (dameng.com)

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服