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

相关推荐
百***81271 天前
【HTML+CSS】使用HTML与后端技术连接数据库
css·数据库·html
6***3491 天前
MySQL项目
数据库·mysql
木井巳1 天前
【MySQL数据库】数据库基础
数据库·mysql
Wang's Blog1 天前
MySQL: 查询全流程深度解析与性能优化实践指南
数据库·mysql·性能优化
一 乐1 天前
宠物管理|宠物共享|基于Java+vue的宠物共享管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·springboot·宠物
Wang's Blog1 天前
MongoDB小课堂: 高级查询操作符与游标管理综合指南之深度整合逻辑操作符、字段处理、数组查询与游标控制的最佳实践
数据库·mongodb
垂金烟柳1 天前
MongoDB GridFS 历史数据自动化清理实践
数据库·mongodb·自动化
白露与泡影1 天前
MySQL中的12个良好SQL编写习惯
java·数据库·面试
foundbug9991 天前
配置Spring框架以连接SQL Server数据库
java·数据库·spring
q***31891 天前
mysql 迁移达梦数据库出现的 sql 语法问题 以及迁移方案
数据库·sql·mysql