文章目录
- 含义
- 物化视图的语法
- 物化视图的创建
- 1、自动刷新的物化事务 ON COMMIT
- 2、非自动刷新的物化视图 ON demand
- 关于手动刷新
- 物化视图的删除
- 资料参考
含义
什么是物化视图
?
物化视图,通俗点说就是
物理化
的视图。
什么叫物理化
?
将视图以表结构的方式,存储在磁盘中。
在之前的博客中针对普通视图说过,普通视图的本质就是一段 SQL 语句
,本身的数据不会存储在磁盘上,每次查询时,普通视图中的数据,来源于重新执行视图中的SQL语句
。
普通视图就是将
复杂的
、可共用的
SQL片段的封装。
但是,每次进行视图查询操作时,都将触发视图中的sql再次执行,程序的执行,存在执行快慢的问题,在程序界中存在一个说法叫时间复杂度
。
物化视图
相比普通视图而言,是将原本的普通视图中的SQL转换成了对应的表结构,并会在磁盘空间中进行存储。
可以理解为就是一张由SQL语句和查询字段构成的新的表。
当然,作为表
而言,相对应的比如索引
等操作也都可以实现。
但是物化视图
由于占用了更多的服务器内存空间,也就导致出现空间复杂度
的问题。
程序的效率,无非就是在
时间复杂度
与空间复杂度
的取舍。
物化视图的语法
物化视图的创建语法,如下所示:
create materialized
view [view_name]
refresh [fast
|complete
|force
]
[
on [commit
|demand
] |
start with (start_time) next (next_time)
]
as
{创建物化视图用的查询语句}
其中,各项关键字说明如下:
名称 | 用途 | 含义 |
---|---|---|
materialized | 物化视图关键字 | 物理化 |
fast | 刷新方式 | 增量更新,只会刷新自上次刷新以后的修改内容。 |
complete | 刷新方式 | 全部刷新。相当于重新执行一次创建视图的查询语句。 |
force | 刷新方式 | (默认刷新方式)由oracle在需要进行刷新操作时,当可以使用fast模式时,数据刷新将采用fast方式;否则使用complete方式。 |
on commit | 刷新时间(模态) | 在基表 数据事务提交 时,立即刷新对应物化视图。 |
on demand | 刷新时间(模态) | (oracle的默认类型)在用户需要刷新的时候进行刷新操作。这里就要求用户自己动手去刷新数据了(也可以使用job定时刷新) |
start with (start_time) next (next_time) | 刷新时间 | 从指定的时间开始,每隔一段时间(由next指定)就刷新一次 |
物化视图的创建
1、自动刷新的物化事务 ON COMMIT
按照上面的语法与参数说明,创建一个简单的物化视图。
创建一张物化视图表,要求在事务提交后,立刻自动刷新物化视图数据。
create MATERIALIZED VIEW mv_bl_user_list
refresh force -- 由oracle决定该刷新的时候,采取何种方式执行
ON COMMIT -- 刷新模态,触发点
AS
SELECT * FROM bl_user_list
测试:
1、先执行物化视图的创建sql
2、查询基表数据信息
3、查询物化视图的数据信息
4、新增或者更新基表的数据
5、查询物化视图。
6、观察新增的数据是否自动刷新至物化视图中。
基表数据事务提交后,对应的物化视图数据也会同步及时变更!
2、非自动刷新的物化视图 ON demand
创建一个需要手动刷新数据
的物化视图。
CREATE MATERIALIZED VIEW mv_bl_user_list
refresh force
ON demand
AS
SELECT * FROM bl_user_list
测试:
1、先执行物化视图的创建sql
2、查询基表数据信息
3、查询物化视图的数据信息
4、新增或者更新基表的数据
5、查询物化视图。
6、观察新增的数据是否自动刷新至物化视图中。
基表的数据事务提交后,对应物化视图中的数据并不会自动刷新!
关于手动刷新
如果在创建物化视图时,设定刷新模态为 on demand
时,会需要用户进行手动刷新
操作。
比如,将上述的非自动刷新视图进行数据刷新操作。
begin
--dbms_mview.refresh(TAB=>'mv_bl_user_list',METHOD=>'COMPLETE',PARALLELISM=>8);dbms_mview.refresh('mv_bl_user_list','COMPLETE');
end;
物化视图的删除
drop materialized view 物化视图名
资料参考
Oracle物化视图-看这一篇就可以了