物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。
ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。创建物化视图时未作指定,则Oracle按ON DEMAND模式来创建。
1) 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证;
2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;
3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证。
--获取数据库rdbms版本信息
select * from v$version;
CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
--创建on demand的物化视图:
CREATE MATERIALIZED VIEW MV_TONDEMAND refresh force on demand AS SELECT * FROM T;
--分析物化视图,以获得统计信息
Analyze table MV_TONDEMAND compute statistics;
--删除物化视图
drop materialized view MV_TONDEMAND;
--从user_mviews查看物化视图关键定义
select mv.* from user_mviews mv where mv.MVIEW_NAME = 'MV_TONDEMAND'; --请注意大小写,当在引号中查询时一定为大写的,这是oracle默认的,否则查询不出来的。
--从user_tables查询物化视图
select * from user_tables where table_name='MV_TONDEMAND'; --请注意大小写,当在引号中查询时一定为大写的,这是oracle默认的,否则查询不出来的。
--查看物化视图的存储参数
select sg.segment_name,sg.bytes,sg.blocks from user_segments sg where sg.segment_name='MV_TONDEMAND';
--插入一条数据
INSERT INTO T VALUES (3, 'myname3');
--手动刷新物化视图
EXEC DBMS_MVIEW.REFRESH('MV_TONDEMAND');
--查询on demand视图
select * from MV_TOnDemand;
--创建on commit的物化视图:
CREATE MATERIALIZED VIEW MV_TOnCommit refresh force on commit AS SELECT * FROM T;
--插入一条数据
INSERT INTO T VALUES (4, 'myname4');
Commit;
--查询on commit视图
select * from MV_TOnCommit;