当前位置:数据库 > Oracle >>

Oracle普通视图和实体化视图比较

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_VIEW'; 
 
SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME 
-------------------- ------------------ ------------------------------XJZHANG_MAT_VIEW     TABLE              SYSTEM 
 
同样我们通过 DBA_SEGMENTS 来查询一下我们创建的普通视图 
SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where segment_name='XJZHANG_VIEW'; 
未选定行 
可以看出普通视图是不被记录在 DBA_SEGMENTS 中的。 
 
下面我们更新一下XJZHANG_TABLE3 表中的信息,看一下 实体视图的变化信息 
SQL> insert into xjzhang_table3 values ('ccc','00003'); 
已创建 1 行。 
SQL> commit; 
提交完成。 
 
查询该表的信息 
SQL> select * from xjzhang_table3; 
A          B 
---------- ---------- 
aaa        1 
bbb        2 
ccc        3 
 
表的记录增加了一行 
 
我们再来查询实体视图的信息 
SQL> select * from xjzhang_mat_view; 
A          B 
---------- ---------- 
aaa        1 
bbb        2 
 
可以看出实体视图的信息没有发生变化,因为我们在创建实体视图的时候,我们没有指定该视图的刷新方法和刷新模式,所以创建完该实体视图,该视图默认的刷新方法和刷新模式为 FORCE DEMAND 
 
我们可以通过 dba_mviews 这个视图查询我们创建的实体视图的信息 
SQL> select a.mview_name,a.refresh_mode,a.refresh_method from dba_mviews a where a.mview_name='XJZHANG_MAT_VIEW'; 
MVIEW_NAME                     REFRESH_MODE   REFRESH_METHOD 
------------------------------ -------------- -------------- 
XJZHANG_MAT_VIEW               DEMAND         FORCE 
 
这里默认的是手工刷新,所以在这里我们对实体视图进行更新 
SQL> EXEC DBMS_MVIEW.REFRESH('XJZHANG_MAT_VIEW') 
PL/SQL 过程已成功完成。 
 
然后我们再次查询该实体视图 
SQL> SELECT * FROM XJZHANG_MAT_VIEW; 
A          B 
-------
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,