物化视图和普通视图有什么区别?
物化视图实际有个对应的物理表真正存储数据,不需要在查询物化视图时查对应的基表数据而是直接查物化视图表的数据。
和普通视图比较,减少了对基表的访问压力,但存在一个问题,如果物化视图对应的基表数据有更新,物化视图表中的数据就变得陈旧,需要有个策略来保障物化视图的数据同步更新。
而保障这个同步更新,实际是通过创建一些基表日志表、基表触发器、库级触发器来实现同步更新的。
如果要使用物化视图,需要在性能和数据实时性之间进行权衡取舍,做合理的设计。
物化视图怎么来保障数据的同步更新呢?
在创建物化视图时,系统会对应生成一个物理表,物理表对象名是“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;
如果想选择定期清除【从当前时间开始,每隔1天清除一次】可定义如下,会比立即清除多创建个库级触发器来实现日志表的数据定期清理:
创建物化视图
会生成一个物化视图对应的物理表
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';
查看物化视图数据
select * from v_test where prd_id=1 ;
对应物化视图物理表数据:
select * from MTAB$_V_TEST where prd_id=1;
修改基表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 ;
select * from MTAB$_V_TEST where prd_id=1;
更多的物化视图定义和使用语法参见:
物化视图 | 达梦技术文档 (dameng.com)
文章
阅读量
获赞