12c 物化视图 - 刷新方式的对比
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,1. 完全刷新 完全刷新的特点是将主表上的查询结果全部写入和物化视图同名的基表中。当再次刷新时,先清空基表中的所有数据,再加载最新执行的查询结果。使用关键字refresh complete创建完全刷新
千家信息网最后更新 2025年02月08日12c 物化视图 - 刷新方式的对比
1. 完全刷新 完全刷新的特点是将主表上的查询结果全部写入和物化视图同名的基表中。当再次刷新时,先清空基表中的所有数据,再加载最新执行的查询结果。
使用关键字refresh complete创建完全刷新物化视图
create materialized view mvc_costs refresh complete on demand as select promo_id,sum(unit_cost) cost from costs group by promo_id;
手工执行完全刷新命令,完全刷新的字母为C
exec dbms_mview.refresh('MVC_COSTS','C');
如果创建的物化视图视图中包含大量数据,可以使用关键字build deferred不加载数据,等数据库不忙的时候在手工执行完全刷新的方式。 create materialized view mvn_costs tablespace users build deferred refresh complete on demand as select promo_id,sum(unit_cost) cost from costs group by promo_id;
2. 快速刷新 快速刷新也可以理解为增量刷新。增量数据由物化视图日志来管理。物化视图创建成功后,查询结果已经保存在物化视图的同名基表中。当主表产生DML操作时视图日志会将其保存到增量基表中,等到执行快速刷新时将这部分数据同步到物化视图基表中,并清除自身的数据。
快速刷新物化视图需要创建日志
create materialized view log on costs with rowid, sequence(promo_id,unit_cost) including new values;
使用关键字refresh fast创建快速刷新的物化视图
create materialized view mvf_costs segment creation immediate refresh fast with rowid on demand as select promo_id,sum(unit_cost) cost from costs group by promo_id;
手工执行完全刷新命令,完全刷新的字母为F exec dbms_mview.refresh('MVF_COSTS','F');
3. 提交时刷新 刷新是一种触发条件,可以手工触发,也可以自动触发。所谓手工触发就是执行dbms_mview.refresh包来触发刷新事件。在应用程序中不一定需要人为的执行这条命令,而是当程序中满足某些条件后向数据库发去这个命令来完成刷新。另一种触发方式是自动刷新。当主表DML操作提交后就触发刷新事件,从而达到主表和物化视图实时同步的效果。这种方式有些像stream、Oracle GodenGate、或者是DataGuard的逻辑复制。
提交刷新用起来很酷,但是也有需要注意的地方 1. 主表提交时基表也提交,系统开销增大。在繁忙的OLTP系统中会影响一部分性能。如果物化视图更新出错,主表也无法提交事务。 2. 主表和物化视图必须在同一个数据库中 3. 无法在基表上执行分布式事务 4. 不支持含有对象类型或Oracle补充支持类型的物化视图
下面看看提交时刷新物化视图的创建方法 create materialized view log on costs with rowid;
create materialized view mvfc_costs refresh on commit as select promo_id,sum(unit_cost) cost from costs group by promo_id
查看当前物化视图中的数据 select * from mvfc_costs;
PROMO_ID COST ---------- ---------- 999 9313900.88 350 242949.08 351 258268
像主表添加2000条数据 insert into costs select * from costs where rownum<2001 2000 rows created. SH@pdb1 > commit; Commit complete.
再次查看物化视图数据已经变化,刷新成功 SH@pdb1 > select * from mvfc_costs;
PROMO_ID COST ---------- ---------- 999 9607463.83 350 242949.08 351 258268
4. 从不刷新 看上去像个没用的东西,但是存在就有存在的道理。当我们需要保存一份快照,正好用的这个功能。当然通过create table as select的方式也可以实现,物化视图的灵活的地方是可以快照,也可以解除快照变为可刷新的物化视图。 来看看例子: create materialized view mvs_costs never refresh as select promo_id,sum(unit_cost) cost from costs group by promo_id
查看视图描述信息 select mview_name,refresh_method,refresh_mode,build_mode,fast_refreshable from user_mviews where mview_name='MVS_COSTS'
MVIEW_NAME REFRESH_ REFRES BUILD_MOD FAST_REFRESHABLE -------------------- -------- ------ --------- ------------------ MVS_COSTS NEVER NEVER IMMEDIATE DIRLOAD_LIMITEDDML
使用下面的sql语句可以将从不刷新的物化视图改变为完全刷新方式
SH@pdb1 > alter materialized view mvs_costs refresh on demand complete;
Materialized view altered.
状态从never修改为complete SH@pdb1 > select mview_name,refresh_method,refresh_mode,build_mode,fast_refreshable from user_mviews where mview_name='MVS_COSTS';
MVIEW_NAME REFRESH_ REFRES BUILD_MOD FAST_REFRESHABLE -------------------- -------- ------ --------- ------------------ MVS_COSTS COMPLETE DEMAND IMMEDIATE DIRLOAD_LIMITEDDML
横向对比各种物化视图的刷新方式会发现有些先进、有些落后。其实不是这样的,每个功能都有适合它的使用场景。最适合的才是最好的。
1. 完全刷新 完全刷新的特点是将主表上的查询结果全部写入和物化视图同名的基表中。当再次刷新时,先清空基表中的所有数据,再加载最新执行的查询结果。
使用关键字refresh complete创建完全刷新物化视图
create materialized view mvc_costs refresh complete on demand as select promo_id,sum(unit_cost) cost from costs group by promo_id;
手工执行完全刷新命令,完全刷新的字母为C
exec dbms_mview.refresh('MVC_COSTS','C');
如果创建的物化视图视图中包含大量数据,可以使用关键字build deferred不加载数据,等数据库不忙的时候在手工执行完全刷新的方式。 create materialized view mvn_costs tablespace users build deferred refresh complete on demand as select promo_id,sum(unit_cost) cost from costs group by promo_id;
2. 快速刷新 快速刷新也可以理解为增量刷新。增量数据由物化视图日志来管理。物化视图创建成功后,查询结果已经保存在物化视图的同名基表中。当主表产生DML操作时视图日志会将其保存到增量基表中,等到执行快速刷新时将这部分数据同步到物化视图基表中,并清除自身的数据。
快速刷新物化视图需要创建日志
create materialized view log on costs with rowid, sequence(promo_id,unit_cost) including new values;
使用关键字refresh fast创建快速刷新的物化视图
create materialized view mvf_costs segment creation immediate refresh fast with rowid on demand as select promo_id,sum(unit_cost) cost from costs group by promo_id;
手工执行完全刷新命令,完全刷新的字母为F exec dbms_mview.refresh('MVF_COSTS','F');
3. 提交时刷新 刷新是一种触发条件,可以手工触发,也可以自动触发。所谓手工触发就是执行dbms_mview.refresh包来触发刷新事件。在应用程序中不一定需要人为的执行这条命令,而是当程序中满足某些条件后向数据库发去这个命令来完成刷新。另一种触发方式是自动刷新。当主表DML操作提交后就触发刷新事件,从而达到主表和物化视图实时同步的效果。这种方式有些像stream、Oracle GodenGate、或者是DataGuard的逻辑复制。
提交刷新用起来很酷,但是也有需要注意的地方 1. 主表提交时基表也提交,系统开销增大。在繁忙的OLTP系统中会影响一部分性能。如果物化视图更新出错,主表也无法提交事务。 2. 主表和物化视图必须在同一个数据库中 3. 无法在基表上执行分布式事务 4. 不支持含有对象类型或Oracle补充支持类型的物化视图
下面看看提交时刷新物化视图的创建方法 create materialized view log on costs with rowid;
create materialized view mvfc_costs refresh on commit as select promo_id,sum(unit_cost) cost from costs group by promo_id
查看当前物化视图中的数据 select * from mvfc_costs;
PROMO_ID COST ---------- ---------- 999 9313900.88 350 242949.08 351 258268
像主表添加2000条数据 insert into costs select * from costs where rownum<2001 2000 rows created. SH@pdb1 > commit; Commit complete.
再次查看物化视图数据已经变化,刷新成功 SH@pdb1 > select * from mvfc_costs;
PROMO_ID COST ---------- ---------- 999 9607463.83 350 242949.08 351 258268
4. 从不刷新 看上去像个没用的东西,但是存在就有存在的道理。当我们需要保存一份快照,正好用的这个功能。当然通过create table as select的方式也可以实现,物化视图的灵活的地方是可以快照,也可以解除快照变为可刷新的物化视图。 来看看例子: create materialized view mvs_costs never refresh as select promo_id,sum(unit_cost) cost from costs group by promo_id
查看视图描述信息 select mview_name,refresh_method,refresh_mode,build_mode,fast_refreshable from user_mviews where mview_name='MVS_COSTS'
MVIEW_NAME REFRESH_ REFRES BUILD_MOD FAST_REFRESHABLE -------------------- -------- ------ --------- ------------------ MVS_COSTS NEVER NEVER IMMEDIATE DIRLOAD_LIMITEDDML
使用下面的sql语句可以将从不刷新的物化视图改变为完全刷新方式
SH@pdb1 > alter materialized view mvs_costs refresh on demand complete;
Materialized view altered.
状态从never修改为complete SH@pdb1 > select mview_name,refresh_method,refresh_mode,build_mode,fast_refreshable from user_mviews where mview_name='MVS_COSTS';
MVIEW_NAME REFRESH_ REFRES BUILD_MOD FAST_REFRESHABLE -------------------- -------- ------ --------- ------------------ MVS_COSTS COMPLETE DEMAND IMMEDIATE DIRLOAD_LIMITEDDML
横向对比各种物化视图的刷新方式会发现有些先进、有些落后。其实不是这样的,每个功能都有适合它的使用场景。最适合的才是最好的。
视图
数据
方式
手工
命令
关键
关键字
增量
快照
数据库
日志
结果
查询
成功
事件
事务
从不
再次
功能
地方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
王者服务器天崩了
数据库安全性法律法规
域控服务器 管理员用户
数据库原理第十章课后答案
数据库添加表名注释
60dnf数据库
校园网络安全毕设
金山区优势软件开发服务生产厂家
河南未央网络技术公司
gdbm数据库
京东云提供计算服务器
微信支付服务器怎么用
什么数据库能查到值
高防服务器加安全狗
信息工程系网络技术班
如皋网络安全宣传
树形软件开发
redis高性能数据库
网络技术QNQ
数据库网络工程师招聘
尉氏百事通网络技术有限公司
网络安全事件应急预案应当分级
NTP服务器异常怎么解决
网络安全防火墙心得
中国特种设备作业人员数据库查询
数据库列默认值
北京二手服务器回收虚拟主机
软件开发如何开展工作计划
eeg数据库
网络技术QNQ