日期:2014-05-16  浏览次数:20467 次

Oracle普通视图和实体化视图比较
相对于普通的视图来说,实体化视图的不同之处在于实体化视图管理存储数据,占据数据库的物理空间。实体化视图的结果会保存在一个普通的数据中,在对实体化视图进行查询的时候不再会对创建实体化视图的基表进行查询,而是直接查询实体化视图对应的结果表,然后通过定期的刷新机制来更新MView表中的数据。

首先我们需要创建表,然后写一个 SELECT 语句 。
SQL> create table xjzhang_table1 (a varchar2(10),b number(10));
表已创建。
SQL> create table xjzhang_table2 (a varchar2(10),b number(10));
表已创建。

向两张表中插入数据
SQL> insert into xjzhang_table1 values ('aaa','00001');
已创建 1 行。
SQL> insert into xjzhang_table1 values ('bbb','00002');
已创建 1 行。
SQL> insert into xjzhang_table2 values ('aa1','00002');
已创建 1 行。
SQL> insert into xjzhang_table2 values ('bb1','00003');
已创建 1 行。
SQL> commit;
提交完成。

然后我们创建一个视图,视图的名称为xjzhang_view
SQL> create view xjzhang_view as select xjzhang_table1.a,xjzhang_table2.b from xjzhang_table1,xjzhang_table2 where xjzhang_table1.b=xjzhang_table2.b;
视图已创建。

然后我们查询视图
SQL> select * from xjzhang_view;
A          B
---------- ----------
bbb        2

然后我们写一个 查询语句
SQL> select xjzhang_table1.a,xjzhang_table2.b from xjzhang_table1,xjzhang_table2 where xjzhang_table1.b=xjzhang_table2.b;
A          B
---------- ----------
bbb        2

可以看到我们查询视图的结果和查询那个SELECT语句的结果是一致的,说明视图是查询一个 或者多个表的 SELECT 语句的描述。

查询一下我们创建的视图
select object_name,object_type,created,status from dba_objects where
object_name='XJZHANG_VIEW';
OBJECT_NAME     OBJECT_TYPE         CREATED        STATUS
--------------- ------------------- -------------- ------- XJZHANG_VIEW    VIEW                24-6月 -09     VALID

同样我们先创建 一张表表名为 xjzhang_table3同时对表插入数据
SQL> create table xjzhang_table3 (a varchar2(10),b number(5));
表已创建。
SQL> insert into xjzhang_table3 values ('aaa','00001');
已创建 1 行。
SQL> insert into xjzhang_table3 values ('bbb','00002');
已创建 1 行。
SQL> commit;
提交完成。

下面我们开始创建实体视图 (这里 我们创建的实体视图 不是自动刷新 而是需要手动去刷新)
SQL> create materialized view xjzhang_mat_view as select * from xjzhang_table3;
实体化视图已创建。

我们查询一下我们创建的实体视图,实体视图的名称为 xjzhang_mat_view
SQL> select * from xjzhang_mat_view;
A          B
---------- ----------
aaa        1
bbb        2

实体视图从某种意义上说是一张物理表可以通过 DBA_TABLES 进行查询来论证一下
SQL>select TABLE_NAME,TABLESPACE_NAME,STATUS from dba_tables where table_name='XJZHANG_MAT_VIEW';
TABLE_NAME                     TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ --------
XJZHANG_MAT_VIEW               SYSTEM                         VALID

我们来查询一下刚才创建的 视图 xjzhang_view
SQL> select TABLE_NAME,TABLESPACE_NAME,STATUS from dba_tables where table_name='XJZHANG_VIEW';
未选定行
可以看出普通视图在DBA_TABLES 中 是没有记录的,也没有对应的表空间
实体视图会占用一定的存储空间,因为它存放了查询的结果集,那么它也是一种段,可以在DBA_SEGMENTS 中查询出

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where segment_name='XJZHANG_MAT_