Oracle 物化视图创建(materialized)

要想创建 "物化视图,至少具有 'CREATE MATERIALIZED VIEW' 权限"

sql 复制代码
-- 权限查询,非 DBA 用户,则使用 user_sys_privs 即可
SELECT * FROM dba_sys_privs t WHERE t.privilege LIKE '%MATERIALIZED%';
grant create materialized view to scott; -- 授权
revoke create materialized view from scott; -- 回收

创建物化视图时的选项有很多,知晓常用的即可:

sql 复制代码
create materialized view 物化视图名        -- 1. 创建物化视图
build [immediate | deferred] 			  -- 2. 创建方式,默认 immediate
refresh [force | fast | complete | never] -- 3. 物化视图刷新方式,默认 force
on [commit | demand] 					  -- 4. 刷新触发方式
start with 开始时间						  -- 5. 设置开始时间
next 间隔时间				              -- 6. 设置间隔时间
with [primary key | rowid]                -- 7. 类型,默认 primary key
[enable | disable] query rewrite          -- 8. 是否启用查询重写
as	                                      -- 9. 关键字
查询语句;                                  -- 10. select 语句

示例:

sql 复制代码
CREATE MATERIALIZED VIEW mv_memberdetail
BUILD IMMEDIATE 
REFRESH FAST ON COMMIT 
START WITH SYSDATE NEXT SYSDATE + 1/24 -- 每小时刷新一次
AS SELECT
    member_id,
    order_date,
    count(*) AS order_count,
    sum(pay_amount) AS pay_sum
FROM order_detail
GROUP BY member_id, order_date;

语法解释:

sql 复制代码
1. "创建 build" 的方式
	(1) 'immediate':立即生效,默认。
	(2) 'deferred' : 延迟至第一次 refresh 时才生效
2. "刷新 refresh" 的方式
	(1) force	:默认。如果可以 '快速刷新' 就 '快速刷新',否则执行 '完全刷新'
	(2) fast	:'快速刷新'。只刷新 '增量' 部分(前提:创建 '物化日志')
	(3) complete: '完全刷新'。刷新时更新全部数据,包括视图中已经生成的原有数据
	(4) never	: 从不刷新	
3. "触发" (请注意,on demand 中,才需要设置 '开始时间' 和 '间隔时间') -- 冲突
	(1) on commit:基表有 commit 动作时,刷新刷图("不能跨库执行")
	(2) on demand:在需要时刷新
			       [1] 根据后面设定的 '开始时间' 和 '结束时间' 进行刷新
			       [2] 手动调用 dbms_mview 包中的过程进行刷新			       
4. 基于基表的 primary key 或 rowid 创建
	(1) 如果是基于 rowid,则不能对基表执行 '分组函数'、'多表连接' 等需要把
	    多个 rowid 合成一行的操作(理由很简单:到底以哪个 rowid 为准呢?)
5. enable query rewrite 启用查询重写(请注意, '开始时间' 和 '间隔时间' 不支持)-- 冲突
	(1) 不支持的理由也很简单。
		所谓的 '重写',就是讲对基表的查询定位到物化视图上,
		而 '开始时间' 和 '间隔时间' 会造成物化视图上部分数据延迟,所以,不能重写
	(2) 参数: query_rewrite_enabled (可通过 v$parameter 视图查询)

查看物化视图的相关信息(及整体的刷新时间)

sql 复制代码
SELECT
	b.mview_name,
	b.refresh_mode,
	b.refresh_method,
	b.fast_refreshable,
	b.last_refresh_type,
	b.last_refresh_date,
	b.staleness,
	b.* 
FROM
	user_mviews b 
WHERE
	b.mview_name = 'PLM_CUSV_PART_MV'

查看物化视图的最后刷新时间(对应各个基表):

sql 复制代码
SELECT * FROM user_mview_refresh_times;

查看物化视图的数据新鲜度:

sql 复制代码
SELECT b.mview_name, b.* FROM user_mview_analysis;

查询

sql 复制代码
1. 查询物化视图,非 DBA 用户,请查询 all_mviews 或 user_mviews
SELECT *
  FROM dba_mviews t
 WHERE t.owner = 'SCOTT'
   AND t.mview_name = 'MVW_PERSON_INFO';
2. 查询一般视图
SELECT * FROM dba_views;

修改

sql 复制代码
alter materialized view 物化视图名
refresh [force | fast | complete | never]
on [commit | demand]
start with 开始时间
next 间隔时间

删除

sql 复制代码
drop materialized view 物化视图名;

给物化视图加索引

sql 复制代码
CREATE UNIQUE INDEX idx_member_id ON mv_memberdetail(member_id DESC);

注意:

一旦加了物化视图,所涉及的表都会执行物化视图的规则,如果其中一张表正在执行逻辑处于不可用状态,前端逻辑又进行操作了,可能会造成ORA-12048错误。

相关推荐
努力算法的小明13 分钟前
SQL 复杂查询
数据库·sql
斗-匕17 分钟前
MySQL 三大日志详解
数据库·mysql·oracle
代码中の快捷键23 分钟前
MySQL数据库存储引擎
数据库·mysql
只因在人海中多看了你一眼23 分钟前
数据库体系
数据库
尘浮生1 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
六月闻君1 小时前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
SelectDB技术团队1 小时前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
inventecsh1 小时前
mongodb基础操作
数据库·mongodb
白云如幻1 小时前
SQL99版链接查询语法
数据库·sql·mysql
爱吃烤鸡翅的酸菜鱼2 小时前
MySQL初学之旅(4)表的设计
数据库·sql·mysql·database