`
longgangbai
  • 浏览: 7251381 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle使用实例证明实体化视图和视图的区别

 
阅读更多
使用实例证明实体化视图和视图的区别
scott@TICKET> show user;
USER 为 "SCOTT"
scott@TICKET> create table t( key int primary key, val varchar(25));
create table t( key int primary key, val varchar(25))
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


scott@TICKET> drop table t;

表已删除。
创建基础表
scott@TICKET> create table t( key int primary key, val varchar(25));

表已创建。
插入基础数据
scott@TICKET> insert into t  values(1,'a');

已创建 1 行。

scott@TICKET> insert into t  values(2,'b');

已创建 1 行。

scott@TICKET> insert into t  values(3,'c');

已创建 1 行。

scott@TICKET> commit;

提交完成。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 a
         2 b
         3 c
创建视图和物化视图
scott@TICKET> create view v as select * from t;
create view v as select * from t
            *
第 1 行出现错误:
ORA-01031: 权限不足


scott@TICKET> conn / as sysdba
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
sys@TICKET
给scott创建视图和物化视图的授权
sys@TICKET> grant create any view ,create any materialized view to scott;

授权成功。

sys@TICKET> conn scott/tiger
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
scott@TICKET

scott@TICKET> create view v as select * from t;

视图已创建。

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 a
         2 b
         3 c

scott@TICKET> select rowid,a.* from t a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzoAAEAAABHlAAA          1 a
AAASzoAAEAAABHlAAB          2 b
AAASzoAAEAAABHlAAC          3 c

scott@TICKET> select rowid,a.* from v a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzoAAEAAABHlAAA          1 a
AAASzoAAEAAABHlAAB          2 b
AAASzoAAEAAABHlAAC          3 c

scott@TICKET> create materialized view mv  as
  2  select * from t;

实体化视图已创建。

scott@TICKET> select rowid,a.* from mv a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzrAAEAAABH0AAA          1 a
AAASzrAAEAAABH0AAB          2 b
AAASzrAAEAAABH0AAC          3 c

由上面:
 查询t,v,mv的信息可以看出mv的rowid和其他的不一样.
 
scott@TICKET> update t set val='aa' where key=1;

已更新 1 行。

scott@TICKET> commit;

提交完成。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 a
         2 b
         3 c
由上面可以查看当基表t变化,t和v的查询结果相应的发生变化.但是mv的数据不变化.

scott@TICKET> host

scott@TICKET> conn /as sysdba
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
sys@TICKET

sys@TICKET> conn scott/tiger
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
scott@TICKET
刷新物化视图的信息
scott@TICKET> exec dbms_mview.refresh('MV');

PL/SQL 过程已成功完成。

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> update t set val='aa' where key=2;

已更新 1 行。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c
由上面可以看出mv刷新之后,mv,t,v的数据一致.

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c


在创建物化视图的时候指定为快速更新视图
scott@TICKET> create materialized view mv_t refresh fast as select * from t;
create materialized view mv_t refresh fast as select * from t
                                                            *
第 1 行出现错误:
ORA-23413: 表 "SCOTT"."T" 不带实体化视图日志


scott@TICKET> create materialized view log on t;

实体化视图日志已创建。

scott@TICKET> create materialized view mv_t refresh fast as select * from t;

实体化视图已创建。

scott@TICKET> create materialized view mv_t2 refresh fast as select t.* from t;

实体化视图已创建。

由以上可以看出创建物化视图时候指定为快速更新视图必须先创建实体化视图日志,在创建实体化视图.


scott@TICKET> update t set val='abc' where key=3;

已更新 1 行。

scott@TICKET> commit;

提交完成。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 abc

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 abc

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> select * from mv_t;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c

scott@TICKET> select * from mv_t2;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c

执行实体物化视图全部刷新
scott@TICKET> exec dbms_mview.refresh('MV','C');
PL/SQL 过程已成功完成。

执行实体物化视图快速刷新
scott@TICKET> exec dbms_mview.refresh('MV','F');
PL/SQL 过程已成功完成。


执行实体物化视图强制刷新
scott@TICKET> exec dbms_mview.refresh('MV','?');

PL/SQL 过程已成功完成。


查看物化视图的表信息
scott@TICKET> desc user_objects;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(19)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)
 NAMESPACE                                          NUMBER
 EDITION_NAME                                       VARCHAR2(30)

scott@TICKET> col object_name for a30;
scott@TICKET> col object_type for a20;
scott@TICKET> select object_name,object_type from user_objects;

OBJECT_NAME                    OBJECT_TYPE
------------------------------ --------------------
BONUS                          TABLE
SALGRADE                       TABLE
EMP_ENAME_IDX                  INDEX
EMP_JOB_IDX                    INDEX
SUPPLIER                       TABLE
EMP_TEMP                       TABLE
MLOG$_EMP                      TABLE
RUPD$_EMP                      TABLE
TEST                           TABLE
SALES_DELTA                    TABLE
DEPT                           TABLE
EMP                            TABLE
PK_EMP                         INDEX
PK_DEPT                        INDEX
TBS                            TABLE
SYS_C0015204                   INDEX
T                              TABLE
V                              VIEW
MV                             TABLE
SYS_C0015205                   INDEX
MV                             MATERIALIZED VIEW
MLOG$_T                        TABLE
RUPD$_T                        TABLE
MV_T                           TABLE
SYS_C0015206                   INDEX
MV_T                           MATERIALIZED VIEW
MV_T2                          TABLE
SYS_C0015207                   INDEX
MV_T2                          MATERIALIZED VIEW

已选择29行。
由以上信息可以看出
   1.在对象信息(MV_T,MV_T2,MV)可以看出物化视图均对应一个同名称的表.
由此可以解释为当t表更新时候,mv不更新的原因,mv实际是把基表对应的查询结果放在一个表中,查询mv
查询结果集的信息.每
   2.每一个实体化视图日志对应的对应的表如t创建实体化视图日志,对应的表为mlog$_t.
     命名规则为:mlog$_<TBS_NAME>

scott@TICKET> desc mlog$_t;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 KEY                                                NUMBER(38)
 SNAPTIME$$                                         DATE
 DMLTYPE$$                                          VARCHAR2(1)
 OLD_NEW$$                                          VARCHAR2(1)
 CHANGE_VECTOR$$                                    RAW(255)

scott@TICKET> update t set val='aaab'  where key=1;

已更新 1 行。

scott@TICKET> select count(1) from mlog$_t;

  COUNT(1)
----------
         2

scott@TICKET> commit;

提交完成。

scott@TICKET> select count(1) from mlog$_t;

  COUNT(1)
----------
         2

scott@TICKET> select rowid,a.* from mv a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzrAAEAAABH0AAA          1 aa
AAASzrAAEAAABH0AAB          2 aa
AAASzrAAEAAABH0AAC          3 abc

scott@TICKET> spool off;


参考官方网站:http://download.oracle.com/docs/cd/B10501_01/server.920/a96568/rarmviea.htm

 

分享到:
评论

相关推荐

    ORACLE 快照样例

    实体化视图-快照 自己调试的样例 供大家参考

    Oracle数据库管理员技术指南

    贺辞 序 前言 第1章 建立和配置...9.1.3 实体化视图 9.1.4 利用 DBMS_STATS 收集性能统计 数据 9.2 新索引类型 9.2.1 基于函数的索引 9.2.2 反向键索引 9.2.3 降序索引 9.2.4 索引编排表 9.2.5 管理索引的...

    ORACLE9i_优化设计与系统调整

    §13.6 使用实体视图 - 169 §13.6.1 实体视图概念 169 §13.6.2 创建实体视图 169 §13.6.3 使用实体视图 169 §13.6.4 管理实体视图 169 第14章 优化器(Optimizer)简介 170 §14.1 Oracle优化器 170 §14.2 SQL...

    Oracle Database 11g初学者指南--详细书签版

    3.2 专用和共享服务器体系结构之间的差别 51 3.2.1 专用服务器 51 3.2.2 共享服务器 52 3.2.3 设置分派进程 53 3.2.4 监视共享服务器的视图 54 3.3 定义连接 55 3.3.1 连接描述符 55 3.3.2 定义连接描述符 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    mssql 微软 只能能运行在windows平台,体积比较庞大,占用许多系统资源, 但使用很方便,支持命令和图形化管理,收费。 中型企业 Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,...

    Oracle8i_9i数据库基础

    §4.2.45 实体视图完整例子 142 §4.3 序号(sequence) 146 §4.3.1 建立序号 146 §4.3.2 修改序号 147 §4.3.3 使用序号 147 §4.3.4 删除序号 147 §4.4 同义词 148 §4.4.1 建立同义词 148 §4.4.2 删除同义词 ...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    3.2 专用和共享服务器体系结构之间的差别 3.2.1 专用服务器 3.2.2 共享服务器 3.2.3 设置分派进程 3.2.4 监视共享服务器的视图 3.3 定义连接 3.3.1 连接描述符 3.3.2 定义连接描述符 3.3.3 Oracle连接管理器 3.3.4 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例252 自定义最大化、最小化和关闭按钮 321 实例253 禁止改变窗体的大小 323 11.3 设置窗体的标题栏 324 实例254 指定窗体标题栏图标 324 实例255 拖动没有标题栏的窗体 325 实例256 取消窗体标题栏与边框 326 ...

    数据库基础

    §4.2.45 实体视图完整例子 142 §4.3 序号(sequence) 146 §4.3.1 建立序号 146 §4.3.2 修改序号 147 §4.3.3 使用序号 147 §4.3.4 删除序号 147 §4.4 同义词 148 §4.4.1 建立同义词 148 §4.4.2 删除同义词 ...

    JAVA上百实例源码以及开源项目源代码

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

Global site tag (gtag.js) - Google Analytics