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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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表中查到具体存储的表,这样的好处在于调用视图时不用每次都进行逻辑取数,而是直接从表中取数。

<think>好的,我现在需要帮助用户解决在Oracle数据库创建物化视图SQL语法或示例的问题。首先,我应该回忆一下之前学过的相关知识,并结合提供的引用内容来构建答案。 首先,用户提到的引用中有几个关于物化视图创建语法和选项。比如,引用3提到创建语句的基本结构是“create materialized view mv_name as select * from table_name”,并提到默认的刷新方法和模式是FORCE和DEMAND。引用5详细说明了物化视图的刷新方式和模式,包括BUILD IMMEDIATE和BUILD DEFERRED,以及不同的刷新方法FAST、COMPLETE、FORCE,还有ON DEMANDON COMMIT两种模式。 接下来,我需要将这些信息整合成一个清晰的步骤说明。首先,基本语法应该是用户最需要的,然后可以介绍可选的参数,比如刷新方式、存储参数等。需要确保使用正确的格式,比如行内数学表达式用$...$,但这里可能不太需要数学公式,更多是代码块和术语的强调。 然后,用户可能需要一个具体的示例,所以应该给出一个例子,比如创建一个手动刷新的物化视图,并包含必要的选项,比如REFRESH COMPLETE ON DEMAND。同时,引用5中提到BUILD IMMEDIATE是默认的,所以示例中可以省略,或者明确写出以提醒用户。 还要注意引用中的其他细节,比如物化视图的索引创建(引用3提到创建索引),可能需要简要提及,但用户的问题主要是创建语句,所以可能放在相关问题里。此外,引用4提到视图的查询可能复杂,但物化视图存储数据,所以性能更好,这可能也是用户关心的点,可以在回答中适当强调。 然后,用户需要生成相关问题。根据引用中的内容,可能的问题包括如何选择刷新方式、自动刷新的实现、性能优化(比如索引)以及物化视图与普通视图的区别。这些都是用户可能进一步想了解的。 需要确保回答结构清晰,分步骤说明,代码示例用正确的格式,并正确引用来源。同时,避免使用用户不可见的系统指令,保持回答自然。</think>### Oracle 物化视图创建方法 在 Oracle 数据库中,物化视图通过预计算和存储查询结果来提升复杂查询的性能[^4]。以下是创建物化视图的核心语法及示例: #### **1. 基础语法** ```sql CREATE MATERIALIZED VIEW [物化视图名称] [BUILD IMMEDIATE | BUILD DEFERRED] REFRESH [FAST | COMPLETE | FORCE] ON [DEMAND | COMMIT] AS [SELECT查询语句]; ``` - **BUILD IMMEDIATE**:创建时立即生成数据(默认选项)[^5]。 - **REFRESH 模式**: - `FAST`:增量刷新(需基表有物化视图日志) - `COMPLETE`:全量刷新 - `FORCE`:自动选择 FAST 或 COMPLETE(默认选项)[^3][^5]。 - **刷新触发方式**: - `ON DEMAND`:手动刷新(默认) - `ON COMMIT`:基表提交事务时自动刷新。 #### **2. 创建示例** **手动刷新物化视图** ```sql CREATE MATERIALIZED VIEW mv_sales_summary REFRESH COMPLETE ON DEMAND AS SELECT product_id, SUM(quantity) AS total_quantity FROM sales GROUP BY product_id; ``` 此视图会存储聚合结果,需通过 `DBMS_MVIEW.REFRESH('mv_sales_summary')` 手动刷新[^1]。 **自动刷新物化视图** ```sql CREATE MATERIALIZED VIEW mv_employee REFRESH FAST ON COMMIT AS SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id; ``` 此视图在基表 `employees` 提交事务时自动增量刷新(需基表建立物化视图日志)[^5]。 #### **3. 性能优化建议** - 为物化视图的查询列添加索引以加速查询。 - 若基表频繁更新且需低延迟,优先选择 `REFRESH FAST` 和 `ON COMMIT` 组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值