ORACLE创建物化视图(on commit\on demand)

本文介绍了Oracle物化视图的创建及两种刷新方式:OnCommit和OnDemand。OnCommit在基表提交更新时立即刷新,确保数据一致性;OnDemand则按需刷新。示例代码展示了全量和增量刷新的实现,以及定时刷新的配置。物化视图提高了查询效率,但需考虑内存消耗。

ORACLE创建物化视图(on commit\on demand)


前言

个人笔记(物化视图学习笔记,有兴趣的小伙伴可以看看这个视频

物化视图的类型:Oracle提供了两种方式,手工刷新和自动刷新,默认为手工刷新。即:ON DEMAND. ON COMMIT 二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要“被刷新 了,才进行刷新(REFRESH),即蕈物化视图,以保证和基表数据的一致性;而ON COMMIT是 说,一旦基表有了COMMIT,即事为提交,则立刻刷新,立刻更新物化视图,使得数据和基表一 致.

创建语句: create materialized view mv_name [选项N] as select from table_name;

[选项1] **BUILD [IMMEDIATE, DEFERRED]**是否在创建视图时生成数据,默认生成、 DEFERRED为不生成数据,需要的时候生成・

[选项2] REFRESH [FAST, COMPLETE, FORCE, fast是增量刷新,或者说叫 快速刷新;complete为全表刷新;force为如果增量刷新可以使用则使用增量刷新,否则全表刷 新;never则是不进行刷新(不使用).

[选项3] ON [DEMAND, COMMIT]即手工刷新和提交时刷新。

[选项4] START WITH通知数据库完成从主表到本地表第一次复制的时间。 [选项5] NEXT说明了刷新的时间间隔,下一次刷新的时间=上一次执行完成的时间+时间间 隔。

注:一般普通账号并没有建立物化视图的权限,需要使用sysdba或者sysdba赋权的用户才可以建立物化视图

一、表做了更新commit之后就自动更新物化视图(on commit)

代码如下:

--全量更新,增量更新需要定义id字段,并设置为增量更新字段,根据id进行增量更新
CREATE MATERIALIZED VIEW V_AB
REFRESH FORCE ON COMMIT
AS
SELECT
A.ICr A.HAKE, B.CLSIC, B.NAME AS CLSNAME
FROM A,3
WHERE A.CLSID - B.CLSIE;

二、设置定时更新物化视图(on demand)

代码如下:

--也是全量更新,设置定时更新物化视图,需要设置开始日期以及下次刷新时间设置,如下下次刷新时间为明天
CREATE MATERIALIZED VIEW MV_AB
REFRESH FORCE ON DEMAND
START WITH SYSDATE
NEXT SYSDATE+1
AS
SELECT
k.lC, "NAME, B.CLSIE, B.NAME ,
FROM A,B
WHERE A.CL5ID - B.CL5IE;

2.读入数据

代码如下:

--快速刷新fast刷新,如下为一分钟刷新一次,如下这个不是全量刷新创建了根据rowid进行增量刷新的规则,后续根据索引rowid进行增量更新
CREATE MATERIALIZED VIEW LOG ON A WITH ROWID;
CREATE MATERIALIZED VIEW LOG ON B WITH ROWID;
CREATE MATERIALIZED VIEW MV_AB
REFRESH FAST ON DEMAND
START WITH SYSDATE
NEXT SYSDATE+1/1440
AS
SELECT
A.ROWID AS AROWID, B.ROWID AS BROWID,
A.ID, A.NAME, B.CLSID, B.NAME AS CLSNAME
FROM A,B
WHERE A.CLSID = B.CLSI;

物化视图查询多了两列
在这里插入图片描述


总结

物化视图可以自动刷新也可以手动刷新,可以按照自己的需求进行选择,物化视图的创建会消耗物理内存,能够在user_table表中查到具体存储的表,这样的好处在于调用视图时不用每次都进行逻辑取数,而是直接从表中取数。

Oracle创建物化视图,需注意不能使用子查询,若涉及子查询,要先将SQL写入普通视图,再将普通视图写入物化视图[^1]。 物化视图创建语法如下: ```sql create materialized view [view_name] [ build immediate | build deferred ] [ refresh fast | refresh complete| refresh force] [ on commit | on demand start with (start_time) next (next_time) ] as {创建物化视图用的查询语句} ``` 其中,`[view_name]` 为物化视图的名称;`build immediate` 表示在创建时立即填充数据,`build deferred` 表示延迟填充;`refresh fast` 为快速刷新,`refresh complete` 是完全刷新,`refresh force` 会根据情况选择快速或完全刷新;`on commit` 表示在表提交更新后自动刷新,`on demand` 表示按需刷新,`start with (start_time)` 和 `next (next_time)` 用于指定刷新的开始时间和下次刷新时间 [^2]。 以下是创建物化视图的示例: ```sql -- 新建物化视图 create materialized view c##djj.mat_patient refresh force on demand start with sysdate next trunc(sysdate+1) + 1/24*6 as select t.病人编号, t.病人姓名, t.性别, t.就诊科室, t.就诊医生 from c##djj.v_patient t; -- 表做了更新commit之后就自动更新物化视图on commit) create materialized view c##djj.mat_dim refresh force on commit as select * from tab_dim_values; ``` 手动刷新物化视图的方法有: ```sql -- 手动刷新物化视图 exec dbms_mview.refresh('MAT_PATIENT'); -- 创建存储过程来刷新物化视图 CREATE OR REPLACE PROCEDURE SP_REFRESH_EMPLOYEE AS BEGIN DBMS_REFRESH.refresh('UCADM.VIEW_M_CARD'); END SP_REFRESH_EMPLOYEE; -- 在plsql工具中手动刷新物化视图 begin dbms_mview.refresh( list=>'view_m_employee', method=>'complete', refresh_after_errors=>true ); end; -- 手动刷新物化视图的数据 begin DBMS_MVIEW.refresh('TEST_M_V1','C'); -- 'C'=完全刷新,'F'=快速刷新 end; ``` 需要注意,不能通过触发器来刷新物化视图 [^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值