文档库 最新最全的文档下载
当前位置:文档库 › 物化视图

物化视图

物化视图
物化视图

物化视图日志结构

物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途。

物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle 会自动在物化视图日志名称后面加上数字作为序号。

物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE 或明确指定列名。上面这些情况产生的物化视图日志的结构都不相同。

任何物化视图都会包括的列:

SNAPTIME$$:用于表示刷新时间。

DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。

OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。CHANGE_VECTOR$$表示修改矢量,用来表示被修改的是哪个或哪几个字段。

如果WITH后面跟了ROWID,则物化视图日志中会包含:

M_ROW$$:用来存储发生变化的记录的ROWID。

如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。

如果WITH后面跟了OBJECT ID,则物化视图日志中会包含:

SYS_NC_OID$:用来记录每个变化对象的对象ID。

如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:

SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。

如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。

下面通过例子进行详细说明:

SQL> create table t_rowid (id number, name varchar2(30), num number);

表已创建。

SQL> create materialized view log on t_rowid with rowid, sequence (name, num) including new values; 实体化视图日志已创建。

SQL> create table t_pk (id number primary key, name varchar2(30), num number);

表已创建。

SQL> create materialized view log on t_pk with primary key;

实体化视图日志已创建。

SQL> create type t_object as object (id number, name varchar2(30), num number);

2 /

类型已创建。

SQL> create table t_oid of t_object;

表已创建。

SQL> create materialized view log on t_oid with object id;

实体化视图日志已创建。

建立环境后来看看物化视图日志中包含的自动:

SQL> desc mlog$_t_rowid

名称是否为空? 类型

--------------------------------------- -------- -------------

NAME VARCHAR2(30)

NUM NUMBER

M_ROW$$ VARCHAR2(255)

SEQUENCE$$ NUMBER

SNAPTIME$$ DATE

DMLTYPE$$ VARCHAR2(1)

OLD_NEW$$ VARCHAR2(1)

CHANGE_VECTOR$$ RAW(255)

除了最基本的4列之外,由于指定了ROWID、SEQUENCE和NAME、NUM列,因此物化视图日志中包含了相对应的列。

SQL> desc mlog$_t_pk

名称是否为空? 类型

----------------------------------------- -------- -------------

ID NUMBER

SNAPTIME$$ DATE

DMLTYPE$$ VARCHAR2(1)

OLD_NEW$$ VARCHAR2(1)

CHANGE_VECTOR$$ RAW(255)

主键物化视图日志中除了基本列之外还包括基本的主键。

SQL> desc mlog$_t_oid

名称是否为空? 类型

--------------------------------------- -------- -------------

SYS_NC_OID$ RAW(16)

SNAPTIME$$ DATE

DMLTYPE$$ VARCHAR2(1)

OLD_NEW$$ VARCHAR2(1)

CHANGE_VECTOR$$ RAW(255)

对象表的物化视图日志建立后包含系统对象标识列。

物化视图日志结构

一、主键列、ROWID列、OBJECT ID列、SEQUENCE列和建立物化视图时指明的列。

主键、ROWID或OBJECT ID用来唯一表示物化视图日志中的记录。

SEQUENCE会根据操作发生的顺序对物化视图日志中的记录编号。

建立物化视图时指明的列会在物化视图日志中进行记录。

SQL> insert into t_rowid values (1, 'a', 5);

已创建1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新1 行。

SQL> delete t_rowid;

已删除1 行。

SQL> select name, num, m_row$$, sequence$$, dmltype$$ from mlog$_t_rowid;

NAME NUM M_ROW$$ SEQUENCE$$ D

---------- ---------- ------------------ ---------- -

a 5 AAACIDAAFAAAAD4AAA 70019 I

a 5 AAACIDAAFAAAAD4AAA 70020 U

c 5 AAACIDAAFAAAAD4AAA 70021 U

c 5 AAACIDAAFAAAAD4AAA 70022 D

SQL> insert into t_pk values (1, 'a', 5);

已创建1 行。

SQL> update t_pk set name = 'c' where id = 1;

已更新1 行。

SQL> delete t_pk;

已删除1 行。

SQL> select id, dmltype$$ from mlog$_t_pk;

ID D

---------- -

1 I

1 U

1 D

SQL> insert into t_oid values (1, 'a', 5);

已创建1 行。

SQL> update t_oid set name = 'c' where id = 1;

已更新1 行。

SQL> delete t_oid;

已删除1 行。

SQL> select sys_nc_oid$, dmltype$$ from mlog$_t_oid;

SYS_NC_OID$ D

-------------------------------- -

9F6DA94248EE40D5AB1E50700F9566EA I

9F6DA94248EE40D5AB1E50700F9566EA U

9F6DA94248EE40D5AB1E50700F9566EA D

SQL> rollback;

回退已完成。

二、时间列

当基本发生DML操作时,会记录到物化视图日志中,这时指定的时间4000年1月1日0时0分0秒。如果物化视图日志供多个物化视图使用,则一个物化视图刷新后会将它刷新的记录的时间更新为它刷新的时间。

下面建立快速刷新的两个物化视图来演示时间列的变化。(只有建立快速刷新的物化视图才能使用物化视图日志,如果只建立一个物化视图,则物化视图刷新完会将物化视图日志清除掉。

SQL> create materialized view mv_t_rowid refresh fast on commit as

2 select name, count(*) from t_rowid group by name;

实体化视图已创建。

SQL> create materialized view mv_t_rowid1 refresh fast as

2 select name, count(*) from t_rowid group by name;

实体化视图已创建。

SQL> insert into t_rowid values (1, 'a', 5);

已创建1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新1 行。

SQL> delete t_rowid;

已删除1 行。

SQL> select snaptime$$ from mlog$_t_rowid;

SNAPTIME$$

-------------------

4000-01-01 00:00:00

4000-01-01 00:00:00

4000-01-01 00:00:00

4000-01-01 00:00:00

SQL> commit;

提交完成。

SQL> select snaptime$$ from mlog$_t_rowid;

SNAPTIME$$

-------------------

2005-03-05 00:40:32

2005-03-05 00:40:32

2005-03-05 00:40:32

2005-03-05 00:40:32

COMMIT后,物化视图mv_t_rowid刷新,将SNAPTIME$$列更新成自己的刷新时间。

三、操作类型和新旧值

操作类型比较简单:只包括I(INSERT)、D(DELETE)和U(UPDATE)三种。

新旧值也包括三种:O表示旧值(一般对应的操作时DELETE)、N表示新值(一般对应的操作是INSERT),还有一种U(对应UPDATE操作)。

SQL> insert into t_pk values (1, 'a', 5);

已创建1 行。

SQL> insert into t_pk values (2, 'b', 7);

已创建1 行。

SQL> insert into t_pk values (3, 'c', 9);

已创建1 行。

SQL> update t_pk set name = 'c' where id = 1;

已更新1 行。

SQL> update t_pk set id = 4 where id = 2;

已更新1 行。

SQL> delete t_pk where id = 3;

已删除1 行。

SQL> select id, dmltype$$, old_new$$ from mlog$_t_pk;

ID D O

---------- - -

1 I N

2 I N

3 I N

1 U U

2 D O

4 I N

3 D O

已选择7行。

开始是插入三条记录,接着是UPDATE操作。需要注意,对于基于主键的物化视图日志,如果更新了主键,则UPDATE操作转化为一条DELETE操作,一条INSERT操作。最后是DELETE操作。

SQL> drop materialized view log on t_rowid;

实体化视图日志已删除。

SQL> create materialized view log on t_rowid with rowid, sequence (name, num) including new values;

实体化视图日志已创建。

SQL> insert into t_rowid values (1, 'a', 5);

已创建1 行。

SQL> insert into t_rowid values (2, 'b', 7);

已创建1 行。

SQL> insert into t_rowid values (3, 'c', 9);

已创建1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新1 行。

SQL> update t_rowid set id = 4 where id = 2;

已更新1 行。

SQL> delete t_rowid where id = 3;

已删除1 行。

SQL> select name, num, m_row$$, dmltype$$, old_new$$ from mlog$_t_rowid;

NAME NUM M_ROW$$ D O

---------- ---------- ------------------ - -

a 5 AAACIDAAFAAAAD4AAC I N

b 7 AAACIDAAFAAAAD4AAA I N

c 9 AAACIDAAFAAAAD4AAB I N

a 5 AAACIDAAFAAAAD4AAC U U

c 5 AAACIDAAFAAAAD4AAC U N

b 7 AAACIDAAFAAAAD4AAA U U

b 7 AAACIDAAFAAAAD4AAA U N

c 9 AAACIDAAFAAAAD4AAB D O

已选择8行。

查询结果和上面类似,唯一的区别是每条UPDATE

物化视图日志结构

四、修改矢量

最后简单讨论一下CHANGE_VECTOR$$列。

INSERT和DELETE操作都是记录集的,即INSERT和DELETE会影响整条记录。而UPDATE操作是字段集的,UPDATE操作可能会更新整条记录的所有字段,也可能只更新个别字段。

无论从性能上考虑还是从数据的一致性上考虑,物化视图刷新时都应该是基于字段集。Oracle就是通过CHANGE_VECTOR$$列来记录每条记录发生变化的字段包括哪些。

基于主键、ROWID和OBJECT ID的物化视图日志在CHANGE_VECTOR$$上略有不同,但是总体设计的思路是一致的。CHANGE_VECTOR$$列是RAW类型,其实Oracle采用的方式就是用每个BIT位去映射一个列。

比如:第一列被更新设置为02,即00000010。第二列设置为04,即00000100,第三列设置为08,即00001000。当第一列和第二列同时被更新,则设置为06,00000110。如果三列都被更新,设置为0E,00001110。

依此类推,第4列被更新时为10,第5列20,第6列40,第7列80,第8列0001。当第1000列被更新时,CHANGE_VECTOR$$的长度为1000/4+2为252,这也是为什么CHANGE_VECTOR$$列的长度要定义为255的原因。

除了可以表示UPDATE的字段,还可以表示INSERT和DELETE。DELETE操作CHANGE_VECTOR$$列为全0,具体个数由基表的列数决定。INSERT操作的最低位为FE如果基表列数较多,而存在高位的话,所有的高位都为FF。如果INSERT操作是前面讨论过的由UPDATE操作更新了主键造成的,则这个INSERT操作对应的CHANGE_VECTOR$$列为全FF。

SQL> insert into t_rowid values (1, 'a', 5);

已创建1 行。

SQL> insert into t_rowid values (2, 'b', 7);

已创建1 行。

SQL> insert into t_rowid values (3, 'c', 9);

已创建1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新1 行。

SQL> update t_rowid set id = 4 where id = 2;

已更新1 行。

SQL> update t_rowid set name = 'd', num = 11 where id = 3;

已更新1 行。

SQL> delete t_rowid where id = 3;

已删除1 行。

SQL> select name, num, m_row$$, dmltype$$, old_new$$, change_vector$$ from mlog$_t_rowid;

NAME NUM M_ROW$$ D O CHANGE_VEC

-------------------- ---------- ------------------ - - ----------

a 5 AAACIgAAFAAAAD4AAA I N FE

b 7 AAACIgAAFAAAAD4AAB I N FE

c 9 AAACIgAAFAAAAD4AAC I N FE

a 5 AAACIgAAFAAAAD4AAA U U 04

c 5 AAACIgAAFAAAAD4AAA U N 04

b 7 AAACIgAAFAAAAD4AAB U U 02

b 7 AAACIgAAFAAAAD4AAB U N 02

c 9 AAACIgAAFAAAAD4AAC U U 0C

d 11 AAACIgAAFAAAAD4AAC U N 0C

d 11 AAACIgAAFAAAAD4AAC D O 00

已选择10行。

可以看到,正如上面分析的,INSERT为FE,DELETE为00,对第一列的更新为02,第二列为04,第二列和第三列都更新为0C。需

要注意,正常情况下,第一列会从02开始,但是如果对MLOG$表执行了TRUNCATE操作,或者重建了物化视图日志,则可能造成第一列开始位置发生偏移。

SQL> insert into t_pk values (1, 'a', 5);

已创建1 行。

SQL> insert into t_pk values (2, 'b', 7);

已创建1 行。

SQL> insert into t_pk values (3, 'c', 9);

已创建1 行。

SQL> update t_pk set name = 'c' where id = 1;

已更新1 行。

SQL> update t_pk set id = 4 where id = 2;

已更新1 行。

SQL> delete t_pk where id = 1;

已删除1 行。

SQL> select * from mlog$_t_pk;

ID SNAPTIME$$ D O CHANGE_VEC

---------- ------------------- - - ----------

1 4000-01-01 00:00:00 I N FE

2 4000-01-01 00:00:00 I N FE

3 4000-01-01 00:00:00 I N FE

1 4000-01-01 00:00:00 U U 04

2 4000-01-01 00:00:00 D O 00

4 4000-01-01 00:00:00 I N FF

1 4000-01-01 00:00:00 D O 00

已选择7行。

这个结果和ROWID类型基本一致,不同的是,如果更新了主键,会将UPDATE操作在物化视图日志中记录为一条DELETE和一条INSERT,不过这时INSERT对应的CHANGE_VECTOR$$的值是FF。

SQL> insert into t_oid values (1, 'a', 5);

已创建1 行。

SQL> update t_oid set name = 'c' where id = 1;

已更新1 行。

SQL> update t_oid set id = 5 where id = 1;

已更新1 行。

SQL> delete t_oid;

已删除1 行。

SQL> select * from mlog$_t_oid;

SYS_NC_OID$ SNAPTIME$$ D O CHANGE_VEC

-------------------------------- ------------------- - - ----------

94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 I N FE

94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 U U 10

94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 U U 08

94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 D O 00

SQL> select name, segcollength from sys.col$ where obj# =

2 (select object_id from user_objects where object_name = 'T_OID');

NAME SEGCOLLENGTH

-------------------- ------------

SYS_NC_OID$ 16

SYS_NC_ROWINFO$ 1

ID 22

NAME 30

NUM 22

这个结果也和ROWID类型基本一致,需要注意的是,由于对象表包含两个隐含列,因此ID不再是第一个字段,而是第三个,因此对应的值是08。

SQL> create table t (

2 col1 number,

3 col2 number,

4 col3 number,

5 col4 number,

6 col5 number,

7 col6 number,

8 col7 number,

9 col8 number,

10 col9 number,

11 col10 number,

12 col11 number,

13 col12 number

14 );

表已创建。

SQL> create materialized view log on t with rowid;

实体化视图日志已创建。

SQL> insert into t values (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); 已创建1 行。

SQL> update t set col1 = 10;

已更新1 行。

SQL> update t set col11 = 110;

已更新1 行。

SQL> update t set col5 = 50, col12 = 120;

已更新1 行。

SQL> delete t;

已删除1 行。

SQL> select * from mlog$_t;

M_ROW$$ SNAPTIME$$ D O CHANGE_VEC

------------------ ------------------- - - ---------- AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 I N FEFF AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 U U 0200 AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 U U 0008 AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 U U 2010 AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 D O 0000

最后看一个包含列数较多的例子,唯一需要注意的是,低位在左,高位在右。

Oracle如何根据物化视图日志快速刷新物化视图

Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理。

首先,看一下物化视图的结构:

SQL> create table t (id number, name varchar2(30), num number);

表已创建。

SQL> create materialized view log on t with rowid, sequence (id, name) including new values ;

实体化视图日志已创建。

SQL> desc mlog$_t

名称是否为空? 类型

---------------------------------------- -------- ------------

ID NUMBER

NAME VARCHAR2(30)

M_ROW$$ VARCHAR2(255)

SEQUENCE$$ NUMBER

SNAPTIME$$ DATE

DMLTYPE$$ VARCHAR2(1)

OLD_NEW$$ VARCHAR2(1)

CHANGE_VECTOR$$ RAW(255)

ID和NAME是建立物化视图日志时指定的基表中的列,它们记录每次DML操作对应的ID和NAME的值。

M_ROW$$保存基表的ROWID信息,根据M_ROW$$中的信息可以定位到发生DML操作的记录。

SEQUENCE$$根据DML操作发生的顺序记录序列的编号,当刷新时,根据SEQUENCE$$中的顺序就可以和基表中的执行顺序保持一致。

SNAPTIME$$列记录了刷新操作的时间。

DMLTYPE$$的记录值I、U和D,表示操作是INSERT、UPDATE还是DELETE。

OLD_NEW$$表示物化视图日志中保存的信息是DML操作之前的值(旧值)还是DML操作之后的值(新值)。除了O和N这两种类型外,对于UPDATE操作,还可能表示为U。

CHANGE_VECTOR$$记录DML操作发生在那个或那几个字段上。

有关物化视图日志结构的详细描述,可以参考文档:

物化视图日志结构:https://www.wendangku.net/doc/3518058146.html,/post/468/20498

根据上面的描述,可以发现,当刷新物化视图时,只需要根据SEQUENCE$$列给出的顺序,通过M_ROW$$定位到基表的记录,如果是UPDATE操作,通过CHANGE_VECTOR$$定位到字段,然后根据基表中的数据重复执行DML操作。

如果物化视图日志只针对一个物化视图,那么刷新过程就是这么简单,还需要做的不过是在刷新之后将物化视图日志清除掉。

但是,Oracle的物化视图日志是可以同时支持多个物化视图的快速刷新的,也就是说,物化视图在刷新时还必须判断哪些物化视图日志记录是当前物化视图刷新需要的,哪些是不需要的。而且,物化视图还必须确定,在刷新物化视图后,物化视图日志中哪些记录是需要清除的,哪些是不需要清除的。

回顾一下物化视图日志的结构,发现只剩下一个SHAPTIME$$列,那么Oracle如何仅通过这一列就完成了对多个物化视图的支持呢?下面建立一个小例子,通过例子来进行说明。

使用上文中建立的表和物化视图日志,下面对这个表建立三个快速刷新的物化视图。

SQL> create materialized view mv_t_id refresh fast as

2 select id, count(*) from t group by id;

实体化视图已创建。

SQL> create materialized view mv_t_name refresh fast as

2 select name, count(*) from t group by name;

实体化视图已创建。

SQL> create materialized view mv_t_id_name refresh fast as 2 select id, name, count(*) from t group by id, name;

实体化视图已创建。

SQL> insert into t values (1, 'a', 2);

已创建1 行。

SQL> insert into t values (1, 'b', 3);

已创建1 行。

SQL> insert into t values (2, 'a', 5);

已创建1 行。

SQL> insert into t values (3, 'b', 7);

已创建1 行。

SQL> update t set name = 'c' where id = 3;

已更新1 行。

SQL> delete t where id = 2;

已删除1 行。

SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

ID NAME M_ROW$$ SNAPTIME$$ D

---------- ---------- ------------------ ------------------- -

1 a AAACJEAAFAAAAD4AAA 4000-01-01 00:00:00 I

1 b AAACJEAAFAAAAD4AAB 4000-01-01 00:00:00 I

2 a AAACJEAAFAAAAD4AAC 4000-01-01 00:00:00 I

3 b AAACJEAAFAAAAD4AAD 4000-01-01 00:00:00 I

3 b AAACJEAAFAAAAD4AAD 4000-01-01 00:00:00 U

3 c AAACJEAAFAAAAD4AAD 4000-01-01 00:00:00 U

2 a AAACJEAAFAAAAD4AAC 4000-01-01 00:00:00 D

已选择7行。

当发生了DML操作后,物化视图日志中的SNAPTIME$$列保持的值是4000-01-01 00:00:00。这个值表示这条记录还没有被任何物化视图刷新过。第一个刷新这些记录的物化视图会将SNAPTIME$$的值更新为物化视图当前的刷新时间。

SQL> exec dbms_mview.refresh('MV_T_ID')

PL/SQL 过程已成功完成。

SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

ID NAME M_ROW$$ SNAPTIME$$ D

---------- ---------- ------------------ ------------------- -

1 a AAACJEAAFAAAAD4AAA 2005-03-06 00:56:59 I

1 b AAACJEAAFAAAAD4AAB 2005-03-06 00:56:59 I

2 a AAACJEAAFAAAAD4AAC 2005-03-06 00:56:59 I

3 b AAACJEAAFAAAAD4AAD 2005-03-06 00:56:59 I

3 b AAACJEAAFAAAAD4AAD 2005-03-06 00:56:59 U

物化视图

ORACLE中的物化(实体)视图 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 物化视图可以查询表,视图和其它的物化视图。 通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。 本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。 在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。 1.主键物化视图: 下面的语法在远程数据库表emp上创建主键物化视图SQL> CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST START WITH SYSDATE 1/48 + NEXT SYSDATE WITH PRIMARY KEY

AS SELECT * FROM emp@remote_db; created. view Materialized 注意:当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下: SQL> CREATE MATERIALIZED VIEW LOG ON emp; Materialized view log created. 2.Rowid物化视图 下面的语法在远程数据库表emp上创建Rowid物化视图SQL> CREATE MATERIALIZED VIEW mv_emp_rowid WITH ROWID REFRESH AS SELECT * FROM emp@remote_db; Materialized view log created. 3.子查询物化视图 下面的语法在远程数据库表emp上创建基于emp和dept表的子查询物化视图 SQL> CREATE MATERIALIZED VIEW mv_empdept AS SELECT * FROM emp@remote_db e EXISTS WHERE (SELECT * FROM dept@remote_db d WHERE e.dept_no = d.dept_no) Materialized view log created. REFRESH 子句

第六章视图分析

第六章视图 1.概述 ?视图(View)是从一个或多个表(其他视图)中导出的表,其结构和数据是建立在对表的查询基础之上的。所以视图不是真实存在的基础表, 而是一张虚表。视图所对应的数据并不实际地以视图结构存储在数据库 中,而是存储在视图所引用的表中。 ?视图一经定义便存储在数据库中,与其相对应的数据并没有像表一样在数据库中另外存储一份,通过视图看到的数据只是存放在基表中的数据。 对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的 限制)和删除。 ?当对视图中的数据进行修改时,相应的基表的数据也要发生变化,同时,如果基表的数据发生变化,则这种变化也可以自动地反映到视图中 2.视图的特点 1.视点集中,减少对象大小 视图让用户能够着重于他们所需要的特定数据或所负责的特定要求,如 用户可以选择特定行或特定列。 2.从异构源组织数据 可以在连接两个或多个表的复杂查询的基础上创建视图,这样可以将单 个表显示给用户。 3.隐藏数据的复杂性,简化操作 视图向用户隐藏了数据库设计的复杂性,这样如果开发者改变数据库设 计,不会影响到用户与数据库交互。另外,用户可将经常使用的连接查 询、嵌套查询或联合查询定义为视图。 4.简化用户权限的管理 可以将视图的权限授予用户,而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。 3.视图的四种类型 ?关系视图: 关系视图(relational view)基本上就是经过存储的查询,可以将它的输出看作是 一个表。它就是基于关系数据的存储对象。 ?内嵌视图: 又称为嵌套查询,是嵌入到父查询中的查询,能够在任何可以使用表名称的地 方使用。 ?对象视图: 为了迎合数据库中对象类型而将关系表投射到特定数据类型的虚拟对象表中, 视图的每行都是带有属性、方法和唯一标识(OID)的对象实例。 ?物化视图: 就是在数据库中查询结果存储在视图中,并支持查询重写、刷新、提交等特性 的视图 4.视图的创建及管理

Oracle物化视图创建全过程

Oracle物化视图创建全过程 我们如果遇到需要从其它系统的数据库中取数据进行统计分析的问题,可疑选择使用ORACLE的ODI工具进行抽数,但是对方提供的数据库用户下没有任何对象,只是有查询所有表的权限,因此无法做数据反向。 于是决定使用物化视图,把对方数据库中的数据拿过来,虽然数据量比较大,但是每月只拿一次,而且如果设置成增量更新,也不会太慢。现在记录下物化视图的创建过程(以一张表为例)。 一、准备条件以及备注 假设双方数据库都是ORACLE10g,需要同步过来的表名叫:GG_ZLX_ZHU,对方数据库用户名:username,密码:password,SID:CPEES。 二、开始干活 1、首先要创建DB_LINK CREATE DATABASE LINK to_cpees CONNECT TO "username" identified by "password" using "CPEES"; 或者 create database link to_cpees connect to username identified by "password" using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =IP地址)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = cti) ) )'; 其中CPEES为新建的到对方数据库的TNS。执行,现在我们就已经创建了到对方数据库的DB_LINK TO_CPEES。 2、创建Oracle物化视图快速刷新日志 因为上面说过,以后视图的刷新将采用增量刷新的方式,因此,为配合增量刷新,ORACLE要求要在住表上建立物化视图日志。 CREATE MATERIALIZED VIEW LOG ON GG_ZLX_ZHU WITH PRIMARY KEY INCLUDING NEW VALUES; (上面的SQL要在远程数据库上执行,不能在本地执行) 3、创建Oracle物化视图 Oracle物化视图,从名字上面来开,它应该是属于视图,但是确实物化。 其物化是针对普通视图并没有真正的物理存储而言,其实可以简单的把物化视图看做一个物理表。

物化视图BUG 导致CPU消耗超高

单击此项可添加到收藏夹 MATERIALIZED VIEW FAST REFRESH IS VERY SLOW, "AS OF SNAPSHOT" CURSORS NOT BEING SHARED (文档ID 1051346.1) 转到底部转到底部 In this Document Symptoms Cause Solution References Applies to: Oracle Database - Enterprise Edition - Version 10.1.0.5 to 11.2.0.2.0 [Release 10.1 to 11.2] Information in this document applies to any platform. Symptoms On a production database version 11.1.0.7, the fast refresh of a nested materialized view takes a lot of time comparing to the select statement used for the creation of the materialized view. The refresh of the mview takes approximately 16 min. The select statement itself finishes in about 8 seconds. It can be seen that most of the time is spent with the parse of update sys.sumpartlog$ statement. ******************************************************************************* * updatesys.sumpartlog$ s set s.timestamp = :1, s.scn = :2 where

物化视图

物化视图日志结构 物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途。 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle 会自动在物化视图日志名称后面加上数字作为序号。 物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE 或明确指定列名。上面这些情况产生的物化视图日志的结构都不相同。 任何物化视图都会包括的列: SNAPTIME$$:用于表示刷新时间。 DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。 OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。CHANGE_VECTOR$$表示修改矢量,用来表示被修改的是哪个或哪几个字段。 如果WITH后面跟了ROWID,则物化视图日志中会包含: M_ROW$$:用来存储发生变化的记录的ROWID。 如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。 如果WITH后面跟了OBJECT ID,则物化视图日志中会包含: SYS_NC_OID$:用来记录每个变化对象的对象ID。 如果WITH后面跟了SEQUENCE,则物化视图日子中会包含: SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。 如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。 下面通过例子进行详细说明: SQL> create table t_rowid (id number, name varchar2(30), num number);

oracle物化视图同步

1.目标服务器A,数据库oracle,待同步数据表city,用户hnjcfx,口令hnjcfx 2.同步服务器B,数据库oracle,需要同步A中city表数据,服务名192(参见tnsnames.ora文件中配置,按照格式需自己配置) 192 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.192)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = fantlam) ) ) 注:HOST 为目标服务器IP地址 Fantlam为目标服务器数据库实例名 3.登录B数据库,在Boracle数据库中创建连接Aoracle数据库的连接名testlk:Create public database link testlk connect to hnjcfx identified by hnjcfx using ‘192’ 注:目标方数据库(A)的init.ora文件中的global_names设为false。 创建数据库链接的帐号(B)必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号(hnjcfx)必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。 4.在A数据库中创建存储日志视图 Create materialized view log on city 5.在B 数据库中创建物化视图city create materialized view city refresh force on demand with rowid START WITH TO_DATE('08-12-2008 16:40:00','dd-mm-yyyy hh24:mi:ss') NEXT SYSDATE+1/(24*60)as SELECT * from city@testlk; 注:如果24小时同步刷新数据改动SYSDATE+1 6.B数据库中city视图是由A同步来的,只可以做查询操作,无增改删操作。

物化视图PPT

SQL> CREATE MATERIALIZED VIEW 2> depart_sal_sum as 3> select d.department_name, sum(e.salary) 4> from departments d, employees e 5> where d.department_id = e.department_id 6> group by d.department_name; SQL> CREATE MATERIALIZED VIEW 2> depart_sal_sum as 3> select d.department_name, sum(e.salary) 4> from departments d, employees e 5> where d.department_id = e.department_id 6> group by d.department_name;

?刷新一个到多个基表的物化视图 DBMS_MVIEW.REFRESH (’CUST_SALES ’, parallelism => 10);DBMS_MVIEW.REFRESH (’CUST_SALES ’, parallelism => 10);DBMS_MVIEW.REFRESH_DEPENDENT DBMS_MVIEW.REFRESH_DEPENDENT((’SALES ’);DBMS_MVIEW.REFRESH_DEPENDENT (’SALES ’);DBMS_MVIEW.REFRESH_ALL_MVIEWS DBMS_MVIEW.REFRESH_ALL_MVIEWS; ;DBMS_MVIEW.REFRESH_ALL_MVIEWS ;

物化视图使用详解

一.物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。 物化视图可以查询表,视图和其它的物化视图。 通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。 在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。 物化视图由于是物理真实存在的,故可以创建索引。 1.1 物化视图可以分为以下三种类型 (1)包含聚集的物化视图; (2)只包含连接的物化视图; (3)嵌套物化视图。 三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明: (1)创建方式(BuildMethods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。

物化视图日志简介

oracle物化视图日志结构 物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途。 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。 物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECT ID 几种类型,同时还可以指定SEQUENCE或明确指定列名。上面这些情况产生的物化视图日志 的结构都不相同。 任何物化视图都会包括的4列: SNAPTIME$$:用于表示刷新时间。 DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U 表示UPDATE操作。 CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。 如果WITH后面跟了ROWID,则物化视图日志中会包含:M_ROW$$:用来存储发生变化的记录的ROWID。 如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。 如果WITH后面跟了OBJECT ID,则物化视图日志中会包含:SYS_NC_OID$:用来记录每个变化对象的对象ID。 如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。 如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。 下面通过例子进行详细说明: SQL> create table t_rowid (id number, name varchar2(30), num number); 表已创建。 SQL> create materialized view log on t_rowid with rowid, sequence (name, num) including new values; 实体化视图日志已创建。 SQL> create table t_pk (id number primary key, name varchar2(30), num number); 表已创建。 SQL> create materialized view log on t_pk with primary key; 实体化视图日志已创建。

materialized view(物化视图)基础知识

materialized view(物化视图)基础知识 1物化视图概念 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 物化视图可以查询表,视图和其它的物化视图。 通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。 本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。 在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。 1.1主键物化视图: 下面的语法在远程数据库表emp上创建主键物化视图 SQL> CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/48 WITH PRIMARY KEY AS SELECT * FROM emp@remote_db; Materialized view created. 注意:当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下: SQL> CREATE MATERIALIZED VIEW LOG ON emp; Materialized view log created.2.Rowid物化视图

下面的语法在远程数据库表emp上创建Rowid物化视图 SQL> CREATE MATERIALIZED VIEW mv_emp_rowid REFRESH WITH ROWID AS SELECT * FROM emp@remote_db; Materialized view log created. 3.子查询物化视图 下面的语法在远程数据库表emp上创建基于emp和dept表的子查询物化视图 SQL> CREATE MATERIALIZED VIEW mv_empdept AS SELECT * FROM emp@remote_db e WHERE EXISTS (SELECT * FROM dept@remote_db d WHERE e.dept_no = d.dept_no) Materialized view log created. REFRESH 子句[refresh [fast|complete|force] [on demand | commit] [start with date] [next date] [with {primary key|rowid}]] Refresh选项说明: a. oracle用刷新方法在物化视图中刷新数据. b. 是基于主键还是基于rowid的物化视图 c. 物化视图的刷新时间和间隔刷新时间

用友oracle物化视图实现数据同步

ORACLE物化视图 实现数据同步简介 NC57新增双引擎查询功能,以下报表支持此功能: 财务: 总账—辅助余额表 总账—辅助明细账 总账—辅助属性余额表 总账—多维分析表 应收—余额表 应收—应收账龄分析 应付—余额表 应付—应付账龄分析 供应链: 采购管理—供应商暂估余额表 销售管理—综合日报 库存管理—收发存汇总表 库存管理—出入库流水账 存货核算—收发存汇总表 存货核算—入库汇总表 存货核算—出库汇总表

本功能只支持oracle数据库。要使用此功能,需要在oracle 数据库上按以下步骤进行配置。 一、按照NC标准创建一个oracle空用户,假设为nc57des(以下称为目标用户) 二、使用该空用户创建到NC数据库的数据库链接,假设NC数据库用户为nc57(以下称为 源用户) Create database link dblink connect to nc57 identified by密码using ora10g_127.0.0.1; 需要注意:如果源用户和目标用户未在同一台数据库服务器上,则在目标数据库服务器上的tnsnames.ora中已经配置了源用户所在数据库服务器,本例假设源用户和目标用户在同一台服务器上。 三、在源用户上执行以下sql: 1、对于已定义主键的表,分别执行以下sql: create materialized view log on 表名with primary key; 2、对于未定义主键的表,分别执行以下sql: create materialized view log on 表名with rowid; 四、在目标用户上执行以下sql: 1、对于已定义主键的表,分别执行以下sql: create materialized view 表名refresh fast start with sysdate next sysdate+10/1440 as select * from 表名@dblink; 以上假设为10分钟同步一次,可以根据需要进行修改同步的频率,单位为“分钟” 2、对于未定义主键的表,分别执行以下sql: create materialized view 表名refresh fast with rowid start with sysdate next sysdate+10/1440 as select * from表名@dblink; 以上假设为10分钟同步一次,可以根据需要进行修改同步的频率,单位为“分钟”

如何创建物化视图

1、创建方式(Build Methods):Build Immediate 和Build Deferred两种。Build Immediate 是在创建物化视图的时候就生成数据,而Build Deferred则在创建时不生成数据,以后根据需要再生成数据。默认为Build Immediate 。 2、查询重写(Query Rewrite):Enable Query Rewrite和Disable Query Rewrite两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为Disable Query Rewrite。 3、刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:On Demand和On Commit。On Demand指物化视图在用户需要的时候进行刷新,可以手工通过 DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。On Commit指物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:Fast 、Complete 、Force和Never。Fast 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。Complete 刷新对整个物化视图进行完全的刷新。如果选择Force方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用Complete 的方式。Never 指物化视图不进行任何刷新。默认值是Force On Demand。 在建立物化视图的时候可以指定Order by 语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。 4、物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为RowID或Primary Key类型的。还可以选择是否包括Sequence、Including New Values 以及指定列的列表。 可以指明On PreBuild Table语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数 Query_Rewrite_integerity必须设置为 trusted或者stale_tolerated。 5、物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在Group by 列表中使用Cube或RollUp,来建立不同等级的聚集物化视图。

【IT专家】创建Oracle物化视图,每5分钟刷新一次使用物化视图日志

本文由我司收集整编,推荐下载,如有疑问,请与我司联系创建Oracle物化视图,每5分钟刷新一次使用物化视图日志创建Oracle物化视图,每5分钟刷新一次使用物化视图日志[英]Create Oracle Materialized View to be refreshed every 5 minute Using materialized view log I’m Trying to create Materialized View which will be updated every 5 minute automatically, I need update based on Mview log table. ?我正在尝试创建物化视图,它将每5分钟自动更新一次,我需要基于Mview日志表进行更新。 I have created Materialized view log on TABLE1 TABLE1.SQL Script ?我在TABLE1 TABLE1.SQL脚本上创建了Materialized视图日志 ?CREATE MATERIALIZED VIEW LOG ON TABLE1; -- MLOG$_TABLE1 Then I’ve created Materialized View ?然后我创建了物化视图 ?CREATE MATERIALIZED VIEW JIBO_MVIEW REFRESH START WITH SYSDATE NEXT SYSDATE +5/24/60 ENABLE QUERY REWRITE AS SELECT O.ID ,O.DATETIME_CREATED ,O.ORIGINATOR ,O.DETAILS ,O.PAYMENT_REF FROM TABLE1 O WHERE O.ORIGINATOR LIKE ‘53%’; after changing some value In TABLE1, new Record is inserted MLOG$_TABLE1 log table ?更改一些值后在TABLE1中,新的Record插入了MLOG $ _TABLE1日志表 ? but changed value is not updated in Materialized view (JIBO_MVIEW). (even after one day :) ) ?但在物化视图(JIBO_MVIEW)中未更新更改的值。(纵然一天后:)) As I checked in Alert Log there is problem with auto generated DBMS_JOB, it fails on every executions. ?当我检查警报日志时,自动生成的DBMS_JOB存在问题,每次执行都会失败。 ?- ORA-12012: error on auto execute of job 4263 - ORA-00942: table or view does not

物化视图的创建和快速刷新

物化视图的创建和快速刷新 1.物化视图简介 物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL 语句的正确性和有效性; 物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。 其中物化视图有三种:聚集物化视图、包含连接物化视图、嵌套物化视图。但三种物化视图的快速刷新的限制条件有很大区别,而其他方面则区别不大。 2.物化视图的创建和参数说明 2.1 物化视图实例 南昌营运数据为5000万条左右,每日新增20w条左右。根据报表的实际需求,在物化视图中按照车牌,车队,天汇总统计 后的数据为80万条。这样大大提高了查询的效率。 创建物化视图的语句如下: create materialized view BUSINESS_DATA_CAR_MV BUILD DEFERRED –在创建时不刷新,按照用户设定的时间刷新 refresh force –如果可以快速刷新则进行快速刷新,否则进行完全刷新 on demand –按照指定的方式刷新

start with to_date('14-07-2011 13:41:16', 'dd-mm-yyyy hh24:mi:ss') --第一次刷新时间 next TRUNC(SYSDA TE+1)+ 2/24 --刷新时间间隔 as select to_char(date_up,'yyyy-MM-dd') as day, taxi_group, taxi_company, dispatch_car_no, service_no, sum(decode(sign(OYSTER_CARD_ORIGIN_SUM-OYSTER_CARD_LEFT_SUM),1,1,-1,0)) as cardTime, count(*) as times, sum(decode(sign(OYSTER_CARD_ORIGIN_SUM-OYSTER_CARD_LEFT_SUM),1,OYSTER_ CARD_ORIGIN_SUM-OYSTER_CARD_LEFT_SUM,-1,0)) as cardSum, sum(sum) as sum, sum(distance+free_distance)as total_distance, sum(decode(sign(distance),1,distance,-1,0,distance)) as distance, sum(free_distance) as free_distance, sum(decode(sign(date_down-date_up),1,(date_down-date_up)*24,-1,0)) as workTime, sum(waiting_hour*60+waiting_second)as waiting_time, sum(decode(to_char(date_up,'HH24'),'02',1,'03',1,'04',1,0))as overTimeTimes, from SINGLE_BUSINESS_DA TA_BS bus where date_up <= date_down and(date_down -date_up ) <0.5 and distance>=0 and distance<100 and free_distance<500 group by service_no,dispatch_car_no,to_char(date_up,'yyyy-MM-dd'),taxi_group,taxi_company;, 2.2参数介绍 2.2.1 BUILD BUILD IMMEDIATE :是在创建物化视图的时候就生成数据,。 BUILD DEFERRED :则在创建时不生成数据,以后根据需要在生成数据。 默认为BUILD IMMEDIATE。

ORACLE物化视图

1简介 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 物化视图可以查询表,视图和其它的物化视图。 通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。 物化视图对于前台数据库使用者来说如同一个实际的表,具有和一般表相通的如select等操作,而其实际上是一个视图,一个由系统实现定期刷新其数据的视图(具体刷新时间在定义物化视图的时候已有定义),使用物化视图更可以实现视图的所有功能,而物化视图确不是在使用时才读取,大大提高了读取速度,特别适用抽取大数据量表某些信息以及数据链连接表使用。 本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。 2物化视图语法 create materialized view [view_name] [ [build immediate | build deferred] [enable query rewrite | disable query rewrite] [refresh [fast | complete | force | nevel]] [on demand | commit]

[start with date] [next date] [with {primary key|rowid}] ] as {创建物化视图用的查询语句} Build Methods(创建方式) Query Rewrite(查询重写) 查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。 Refresh属性 (刷新方式 )

最新数据库复习-专升本附答案(EK-绝密版)

一、题型及分值 1、填空题(10小题,10分) 2、选择题(10小题,20分) 3、问答与分析题(4小题,30分) 4、综合题(2小题,40分) 二、知识要点 (一)关系模型的基本概念 【例1】学生社团可以接纳多名学生参加,但每个学生只能参加一个社团,从社团到学生之间的联系类型是_____________。 【例2】层次模型不能直接表示()。 A.1:1联系 B.1:n联系 C.m:n联系 D.1:1和1:n联系 【例3】在三大传统的数据模型中,具有严格的数学理论基础的是________模型。 【例4】数据库的数据独立性包括逻辑独立性和___________。 (二)关系代数运算 【例1】五种基本关系代数运算是( A )。 A.∪,-,×,π和σ B.∪,-,∞,π和σ C.∪,∩,×,π和σ D.∪,∩,∞,π和σ 【例2】在关系代数中,除法运算由基本运算符( C )组成。 A、∪,-,π和σ B、-,∞和π C、-,×和π D、∪,∞,π和σ 【例3】设关系R和S,R∩S的运算等价于( B )。 A.S-(R-S) B.R-(R-S) C.(R-S)∪S D.R∪(R-S) 【例4】在关系代数中,连接运算∞由基本运算符( C )组成。 A、∪,-,π和σ B、-和π C、×和σ D、∪,π和σ 【例5】设关系R和S的属性个数分别为r和s,则(R×S)操作结果的属性个数为_________,元组个数为___________。 【例6】设有如下关系:

关系代数表达式R÷S的运算结果是______________。 【例7】已知有如下三个关系 STUDENT(学号,姓名,性别,年龄,专业) GRADE (学号,课程号,成绩) COURSE(课程号,课程名,学分,课时) 现有如下表达式: π学号,姓名(STUDENT)(π学号,课程号(GRADE) ÷π课程号(COURSE)))。 请用汉语句子写出该表达式表达的查询,并写出与该表达式对应的SQL语句。 答:(1)选修了全部课程的学生的学号和姓名。 (2)select sno,sname From student Where not exists (select * From course Where not exists (select * From sc Where sno = student.sno and cno=https://www.wendangku.net/doc/3518058146.html,o)) (三)数据库的完整性 1、关系的三类完整性约束。 2、触发器。 【例1】关系模式的三类完整性约束条件分别是______________、参照完整性约束和用户定义完整性约束。 【例2】在SQL Server中,在视图上可以定义_________类型的触发器。 【例3】试举例说明在视图上创建instead of 触发器能够使得视图具备可更新功能。 答:如果一个视图涉及到计算列,那么该视图为不可更新视图。 /*创建books表*/ create table books ( bookKey int identity(1,1), bookName nvarchar(10) not null, Color nvarchar(10) not null, ComputedCol as (bookName + Color), Pages int

Oracle物化视图语法

Oracle物化视图语法 物化视图概述: Oracle的物化视图提供了强大的功能,可以用在不同的环境中。在不同的环境中,物化视图的作用也不相同。数据仓库中的物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。在数据仓库中,还经常使用查询重写(query rewrite)机制,这样不需要修改原有的查询语句,Oracle会自动选择合适的物化视图进行查询,完全对应用透明。物化视图和表一样可以直接进行查询。物化视图可以基于分区表,物化视图本身也可以分区。除了在数据仓库中使用,物化视图还用于复制、移动计算等方面。物化视图在很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。 物化视图语法: create materialized view materialized_view_name build [immediate|deferred] --1.创建方式 refresh [complete|fast|force|never] --2.物化视图刷新方式 on [commit|demand] --3.刷新触发方式 start with (start_date) --4.开始时间 next (interval_date) --5.间隔时间 with [primary key|rowid] --默认 primary key ENABLE QUERY REWRITE --7.是否启用查询重写 as --8.关键字 select statement; --9.基表选取数据的select语句 1.创建方式默认是immediate,立即;deferred,延迟,至第一次refresh时,才生效。 2.物化视图刷新方式默认为force,意思是:如果可以快速刷新,就执行快速刷新;否则,执行完全刷新。 complete,完全刷新,即,刷新时更新全部数据,包括视图中已经生成的原有数据。 fast,快速刷新,只刷新增量部分。前提是,需要在基表上创建物化视图日志(见示例)。该日志记录基表数据变化情况,所以才能实现增量刷新。 never,从不刷新。 3.on commit,基表有commit动作时,刷新视图,不能跨库执行(因为不知道别的库的提交动作);on demand,在需要时刷新,即,根据后面设定的起始时间和时间间隔进行刷新,或者,手动调用dbms_mview包中的过程刷新时再执行刷新。4和5.即开始刷新时间和下次刷新的时间间隔。如:start with sysdate next sysdate+1/1440表示马上开始,刷新间隔为1分钟。(与 on commit选项冲突)6.基于基表的主键或者rowid创建。如果是基于rowid,不能对基表执行分组函

相关文档