要想创建 "物化视图,至少具有 '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错误。