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错误。

相关推荐
m0_7482448323 分钟前
StarRocks 排查单副本表
大数据·数据库·python
C++忠实粉丝33 分钟前
Redis 介绍和安装
数据库·redis·缓存
wmd131643067121 小时前
将微信配置信息存到数据库并进行调用
数据库·微信
是阿建吖!1 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
ClouGence1 小时前
Redis 到 Redis 数据迁移同步
数据库·redis·缓存
m0_748236581 小时前
《Web 应用项目开发:从构思到上线的全过程》
服务器·前端·数据库
苏三说技术1 小时前
Redis 性能优化的18招
数据库·redis·性能优化
Tttian6222 小时前
基于Pycharm与数据库的新闻管理系统(2)Redis
数据库·redis·pycharm
做梦敲代码3 小时前
达梦数据库-读写分离集群部署
数据库·达梦数据库