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

物化视图

物化视图
物化视图

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 子句

[refresh

[fast|complete|force]

[on demand | commit]

[start with date] [next date]

[with {primary key|rowid}]]

Refresh选项说明:

a. oracle用刷新方法在物化视图中刷新数据.

b. 是基于主键还是基于rowid的物化视图

c. 物化视图的刷新时间和间隔刷新时间

Refresh方法-FAST子句

增量刷新用物化视图日志(参照上面所述)来发送主表已经修改的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志

SQL> CREATE MATERIALIZED VIEW LOG ON emp; Materialized view log created.

对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。

Refresh方法- COMPLETE子句

完全刷新重新生成整个视图,如果请求完全刷新,oracle会完成完全刷新即使增量刷新可用。

Refresh Method – FORCE 子句

当指定FORCE子句,如果增量刷新可用Oracle将完成增量刷新,否则将完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE),Force选项是默认选项

主键和ROWD子句

WITH PRIMARY KEY选项生成主键物化视图,也就是说物化视图是基于主表的主键,而不是ROWID(对应于ROWID子句). PRIMARY KEY是默认选项,为了生成PRIMARY KEY子句,应该在主表上定义主键,否则应该用基于ROWID的物化视图.

主键物化视图允许识别物化视图主表而不影响物化视图增量刷新的可用性。

Rowid物化视图只有一个单一的主表,不能包括下面任何一项:

 或者聚合函数.

Distinct

 ,子查询,连接和SET操作

Group by

刷新时间

WITH子句通知数据库完成从主表到本地表第一次复制的 START

时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的间隔时间.

SQL> CREATE MATERIALIZED VIEW mv_emp_pk

REFRESH FAST

SYSDATE

WITH

START

2

NEXT SYSDATE

+

WITH PRIMARY KEY

AS SELECT * FROM emp@remote_db;

view

created.

Materialized

在上面的例子中,物化视图数据的第一个副本在创建时生成,以后每两天刷新一次.

总结

物化视图提供了可伸缩的基于主键或ROWID的视图,指定了刷新方法和自动刷新的时间。

物化视图的效率

有两个表:人员表A001有10万数据,机构表B001有5千数据建普通视图:

create or replace view test_v as

select * from A001 a ,B001 B where a.a001721=https://www.wendangku.net/doc/1b9406113.html,uid 建一个物化视图

create MATERIALIZED view test_v_m as

select * from A001 a ,B001 B where a.a001721=https://www.wendangku.net/doc/1b9406113.html,uid 比较效率:

select * from test_v where A001001 like '%军%' or

b001003 like '%001006%' or A001011 like '%1970%' ;用时10秒多

from test_v_m where A001001 like '%军%' or b001003 like '%001006%' or A001011 like '%1970%' ;用时0.125秒

对查询来说,物化视图的效率是普通视图的10/0.125=80倍;相当高啊!

创建多表关联的实体化视图

某些实体化视图包含多表关联,但不包含聚合操作

(例如sum())

例如

Example 8-4

实体化视图是在 sales 表和times,customers 三张表的关联的基础上创建的。创建这种类型的实体化视图的好处是预先处理了代价高昂的关联操作。在任意类型的 DML操作之后,使用fast refresh 的方式来刷新仅包含表关联的实体化视图是可以实现的。

仅包含表关联的实体化视图同样支持在两种情况下刷新:

ON COMMIT 和 ON DEMAND.在 ON COMMIT 下,当基表发生DML操作并提交commit 的时候,实体化视图被刷新。

Oracle不允许实体化视图中有self-jions 的存在。

假如指定刷新方式为

REFRESH FAST, oracle 执行附加的校验,以确定fast refresh能被执行。这些附加的检查包括:

1 每个基表下必须创建相应的materialized view log

2 每个基表的rowid 必须在实体化视图的select 语句中出现

3如果存在外联接,在where 子句不能有任何的selections.并且,所有的关联必须以 AND 相连,并且用“=”操作符。

4如果存在外联接,唯一性约束必须存在于外联的 inner table 的相关列中。

为了提高刷新的速度,必须在实体化视图上创建基表的 rowed 所在列的索引。

Example 8-4 Materialized View Containing Only Joins

CREATE MATERIALIZED VIEW LOG ON sales

WITH ROWID;

CREATE MATERIALIZED VIEW LOG ON times

WITH ROWID;

CREATE MATERIALIZED VIEW LOG ON customers

WITH ROWID;

CREATE MATERIALIZED VIEW detail_sales_mv

PARALLEL BUILD IMMEDIATE

REFRESH FAST

SELECT

s.rowid "sales_rid", t.rowid "times_rid", c.rowid "customers_rid", c.cust_id, c.cust_last_name, s.amount_sold,

s.quantity_sold, s.time_id

FROM sales s, times t, customers c

WHERE s.cust_id = c.cust_id(+) AND s.time_id = t.time_id(+);

在这个示例中,为了执行

fast refresh ,

唯一性约束必须存在于

c.cust_id and t.time_i

d.

必须创建

sales_rid, times_rid, and customers_rid

各自的索引,如此可以提高刷新的速度。

CREATE INDEX mv_ix_salesrid ON detail_sales_mv("sales_rid"); Materialized Views with Aggregates

创建聚合类型的实体化视图。

在数据仓库中,实体化视图中经常会包括一些聚合操作。为了能够进行快速刷新(fast refersh) ,在select 语句中必须包含所有在group by 中出现的列名,并且必须有一个count(*) ,所有在gorup by 中出现的列都必须有一个 count(列名)出现在select 中。同样,所有于实体化视图相关的表上都必须创建实体化和视图日志。有效的聚合函数包括:

SUM

,

COUNT(x)

,

COUNT(*)

,

A VG

,

V ARIANCE

,

STDDEV

,

MIN

, and

MAX ,

被聚合的值可以是任何的

sql

表达式。

Fast refresh

一个包含关联和聚合的实体化视图是可能的。但有如下限制:1

实体化视图中不能包含非复用的表达式

(

具有实时特征的

) 。比如

SYSDATE and ROWNUM.

2

实体化视图中不能包含

RAW or LONG 数据类型。

3

实体化视图相关的表必须创建实体化视图日志,并且满足如下条件包含被实体化视图引用到的所有的列。

指定

with rowed和INCLUDING NEW V ALUES.

如果表的预期操作是

inserts/direct-loads, deletes, and updates的混合,指定SEQUENCE 子句只用

SUM

,

COUNT

,

A VG

,

STDDEV

,

V ARIANCE

,

MIN

and

MAX

支持

fast refresh.

对于每个聚合

agg(expr),

必须相应写一个

count(expr)

与之对应

如果V ARIANCE(expr)or STDDEV(expr)被指定,那么COUNT(expr)and SUM(expr) 必须被指定。Oracle推荐 SUM(expr *expr) 也被指定。在

select列表中必须包含所有group by

中出现的列.如果实体化视图有如下的一点,那么fast refresh 只支持常规DML inserts

和直接路径的装载

(

direct loads

)

a

实体化视图包含MIN 或者 MAX

b 实体化视图包含SUM(expr)

但是没有COUNT(expr)

c

实体化视图中不包含

COUNT(*)如上的实体化视图称之为insert-only materialized view.

包含

MAX or MIN实体化视图在delete或者混合的

DML

操作之后可以是 fast refresh,条件是视图中没有where 子句。

(10g

以上适用

)

如果没有外联接,在where 子句中可以包含有选择性的条件和关联

如果实体化视图中包含外联接,fast refresh只支持在outer table 被修改的情况。同样,唯一性约束必须存在于

inner join table中。如果有外联,所有的关联条件都必须用 AND 连接和必须用 = 操作符。

Example 8-1

Example 1: Creating a Materialized View

CREATE MATERIALIZED VIEW LOG ON products WITH SEQUENCE, ROWID

(prod_id, prod_name, prod_desc, prod_subcategory, prod_subcategory_desc,

prod_category, prod_category_desc, prod_weight_class, prod_unit_of_measure,

prod_pack_size, supplier_id, prod_status, prod_list_price, prod_min_price)

INCLUDING NEW V ALUES;

CREATE MATERIALIZED VIEW LOG ON sales

WITH SEQUENCE, ROWID

(prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold)

INCLUDING NEW V ALUES;

CREATE MATERIALIZED VIEW product_sales_mv

PCTFREE 0

TABLESPACE demo

STORAGE (INITIAL 8k NEXT 8k PCTINCREASE 0)

BUILD IMMEDIATE

REFRESH FAST

ENABLE QUERY REWRITE

AS SELECT p.prod_name, SUM(s.amount_sold) AS dollar_sales,

COUNT(*) AS cnt, COUNT(s.amount_sold) AS cnt_amt

FROM sales s, products p

WHERE s.prod_id = p.prod_id GROUP BY p.prod_name;

Example 8-3 Example 3:

Creating a Materialized View

CREATE MATERIALIZED VIEW LOG ON sales WITH SEQUENCE, ROWID

(prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold)

INCLUDING NEW V ALUES;

CREATE MATERIALIZED VIEW sum_sales

PARALLEL

BUILD IMMEDIATE

REFRESH FAST ON COMMIT AS

SELECT s.prod_id, s.time_id, COUNT(*) AS count_grp,

SUM(s.amount_sold) AS sum_dollar_sales,

COUNT(s.amount_sold) AS count_dollar_sales,

SUM(s.quantity_sold) AS sum_quantity_sales,

COUNT(s.quantity_sold) AS count_quantity_sales

FROM sales s

GROUP BY s.prod_id, s.time_id;

Oracle的实体化视图(MVIEW)的深入研究之一

从Oracle 8i开始提供了实体化视图, 能过预先计算好的中间表来提高应用的访问速度, 在特定的情况下是很有用的一项技术. 另外实体化视图还可用于数据复制, 在这个上面的应用越来越多. MVIEW中经常跗以遇到刷新很慢的情况, 如何提高呢? 首先来研究一下刷新的过程. 下面是用来创建演示表的角本:

CREATE TABLE T_MVLOG (COL1 V ARCHAR2(20));

CREATE MATERIALIZED VIEW LOG ON T_MVLOG

WITH ROWID, sequence;

CREATE MATERIALIZED VIEW MV_T_MVLOG

REFRESH FAST

WITH ROWID

AS

SELECT ROWID R_ID, A.* FROM T_MVLOG A;

我们对DBMS_MVIEW.REFRESH作一个SQL_TRACE, 在这个例子中, 我在基表中插入了一打记录, 然后作跟踪的. 可以看到第一步为:

update "ANYSQL"."MLOG$_T_MVLOG" set snaptime$$ = :1

where snaptime$$ >

to_date('2100-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS') 第二步, 取得在这段时间内发生修改的每一行的ROWID

SELECT DISTINCT M_ROW$$ FROM

(

SELECT M_ROW$$

FROM "ANYSQL"."MLOG$_T_MVLOG" MLOG$ WHERE "SNAPTIME$$" > :1 AND ("DMLTYPE$$" != 'I')

) LOG$

WHERE (M_ROW$$) NOT IN

(

SELECT ROWID FROM "T_MVLOG" "MAS_TAB$"

WHERE MAS_TAB$.ROWID = LOG$.M_ROW$$ )

第三步, 取得刷新后的值

SELECT CURRENT$."R_ID",

CURRENT$."COL1",

ROWIDTOCHAR(CURRENT$.ROWID) M_ROW$$ FROM

(

SELECT "A".ROWID "R_ID","A"."COL1" "COL1" FROM "T_MVLOG" "A"

) CURRENT$,

(

SELECT DISTINCT M_ROW$$ FROM "ANYSQL"."MLOG $_T_MVLOG" MLOG$

WHERE "SNAPTIME$$" > :1 AND ("DMLTYPE$$" != 'D')

) LOG$

WHERE CURRENT$.ROWID = LOG$.M_ROW$$

第四步, 对MVIEW进行插入

INSERT INTO "ANYSQL"."MV_T_MVLOG" ("R_ID","COL1","M_ROW$$")

V ALUES (:1,:2,:3)

最后一步, 删除MVLOG中的值

delete from "ANYSQL"."MLOG$_T_MVLOG" where snaptime$$ <= :1

从这外过程来看, 可以调的方法有四个, 首先尽量使用快速刷新, 提高刷新频率, 其次可以在MLOG$_T_MVLOG这个表的snaptime $$字段上建索引, 第三为刷新的过程设定会话级的DB_FILE_MULTIBLOCK_READ_COUNT以及SORT_AREA_SIZE 等参数, 第四选择时间对MLOG$_T_MVLOG这个表进行重组以减少表的大小.

当在一个表上建了物化视图的日志(Materialized View Log)后, 所有的DML操作都会被相应地记录到物化视图日志表(MLOG$_)中, 如果想对这个表进行操作, 但不想这些操作被记录到日志(MVIEW LOG)中, 应当怎么办呢? 在DBMS_MVIEW包中有两个过程可以用来完成这个要求. 这里我们需要打开两个会话, 其中一个会话以DBA的身份登陆(Session DBA), 另一个会话随便了(Session USER), 按如下次序来进行操作:

在Session USER中先运行以下语句去看一下MVIEW LOG表中

物化视图

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/1b9406113.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,不能对基表执行分组函

相关文档