关联的原始表叫做master table 下图图解 一个数据库中的物化视图(数据基于其他数据库),master table的更新操作将复制到物化视图数据库。

Characteristics ofMaterialized Views(物化视图的特性)
物化视图与普通视图和索引具有某些共同的特性。
物化视图在以下几方面与索引类似:
·都拥有真正的数据,消耗存储
·当master表数据更改时,它们的数据都会随之刷新
·当用于查询重写操作时,它们都可以提升sql的执行性能
·它们的存在对于SQL应用和用户来说是透明的。
物化视图和视图相似的地方是,它显示的数据是其他表或者视图中的,用户可以直接使用SELECT语句来查询物化视图。取决于所需要的刷新类型,物化视图也可以使用DML语句进行更新。
下面的例子创建和填充了一个物化视图,基于的sh用户的三个master tables:
CREATE MATERIALIZED VIEW sales_mv AS
SELECT t.calendar_year, p.prod_id, SUM(s.amount_sold) AS sum_sales
FROM times t, products p, saless
WHERE t.time_id = s.time_id
AND p.prod_id = s.prod_id
GROUPBY t.calendar_year, p.prod_id;
下面的示例删除了sales表,这个表是sales_mv的master 表之一,然后查询sales_mv.
可以查询出数据,因为在物化视图中的数据和master表中的数据是单独存放的.
SQL> DROP TABLE sales;
Table dropped.
SQL> SELECT * FROM sales_mv WHERE ROWNUM< 4;
CALENDAR_YEAR PROD_ID SUM_SALES
------------- ---------- ----------
1998 13 936197.53
1998 26 567533.83
1998 27 107968.24
物化视图可以分区.你可以定义一个物化视图在一个分区表上.以及在物化视图上创建一到多个索引
Refresh Methods forMateralized Views(物化视图的刷新方法)
数据库维护物化视图中数据的方法,就是在master表数据变化以后,将变化刷新到物化视图中.
刷新方法是可以增量的,叫做fast refresh.或者是complete refresh(完整刷新)。
当物化视图初始化且子句是BUILD IMMEDIATE时,会发生complete refresh。除非物化视图引用了预先创建好的表。刷新涉及到执行物化视图定义中的查询。这个处理过程可能很慢,尤其是数据库必须读出和处理大量的数据。
fast refresh消除了从零开始重建物化视图的必要。因此,它仅处理发生的变化,这样非常快的刷新完成。
物化视图可以根据需要或者定时刷新。此外,和master表在同一个数据库中的物化视图,可以在相关基表 事务提交时进行刷新。
为了物化视图可以使用fast refresh 方法。materialized view log或着direct loader log记录了主表的变化。一个materialized view log是一个schema object ,它记录了master表的数据更改,通过它 物化视图可以增量的刷新。每个materialized view log 和一个master表进行关联。materialized view log创建在master table所在的数据库中,所在的schema中。
Query Rewrite(查询重写)
查询重写是一种优化技术,它把用户的对master tables的写请求,转换成意思相同,但包含了对相关物化视图的修改写请求。
当基表包含大量的数据,运算聚集函数或者join是非常昂贵且耗时的。因为物化视图包含的数据是已经计算好的,查询重写可以快速的使用物化视图 对请求进行响应。
CBO查询重写是透明的,无需用户介入,SQL语句中也不需要应用物化视图。
因为查询重写是透明的,物化视图的添加和删除,不会使应用代码中的SQL语句失效。
通常,重写的查询会用物化视图,而不是表,这样减少了响应时间
下图显示了数据库 原始和经过重现的执行计划,然后选择成本最低的执行计划

Overview of Sequences(序列的概述)
序列是一个schema object,多个用户可以使用一个序列来产生唯一的整数。
一个序列提供了很好的灵活性以及不错的执行方法 用来产生 一个数值类型的替代主键。
Sequence Characteristics(序列的特征)
一个序列的创建需要提供以下信息:
·序列的名字
·序列是升序还是降序
·每次间隔多大
·数据库是否需要将一部分sequence产生的值 cache到内存中。
·当序列的限制达到时,是否循环
下面的案例创建一个名叫customers_seq的序列。在oe用户下。
一个应用打算使用这个序列来产生雇员编号。
CREATE SEQUENCE customers_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
第一次引用customers_seq.nextval 将返回1000,第二次将返回1001. 每一次引用都比上一次的值大1
Concurrent Access to Sequences(并发访问序列)
一个序列可以为几个不同的表产生数字.这种情况下,数据库可以自动产生主键,以及协调这些跨越了行或者表的键.举个例子:一个序列可以给orders表和customers表产生主键.
多用户环境中,为了产生唯一数字,而且不增加磁盘开销,这时序列是有用的。
举个例子,两个用户同时插入新行到orders表。
通过使用序列来产生order_id列的唯一值,任何一个用户都不需要等待别人输入下一个值。序列会自动产生正确的值,给每个用户。
每个引用序列的用户 都可以访问他或她的当前序列号,这个序列号就是本会话产生的最后一个序列号。一个用户可以使用一个语句来产生新的序列号或者使用当前系列号(本会话最后产生的序列号)
在一个会话中使用语句产生序列号,这个序列号只在这个会话可用。
个别序列号可能会发生跳过现象,这是因为一个事务产生和使用了这个序列号,这个事务最终又回滚掉了。
警告:如果你的应用需要没有间隙的一组数字,那么你不能使用Oracle序列。你必须自己开发代码来实现这连续的行为。
Overview of Dimensions(维度概述)
一个标准的数据仓库有两个重要的组建,维度表和事实表。
一个维度表用于阐述业务问题的类别
举个例子:时间,地理,产品,部门,以及分销渠道
一个事实表 是一组指定的维度的值 相关联的 事件或者实体
举个例子:销售数量或者利润。
多维度需求的例子包括如下:
·以上升聚合方式,在2007到2008年间,在地理维度上从州上升到国家到全球,跨越所有产品的销售额。
·创建一个跨表格的分析。关于2007-2008年间 在南美运营情况,包括所有的可汇总的
·根据 2008年汽车产品销售收入,列出在亚洲的前 10位销售代表,并按其佣金分级。
很多 多维度问题 经常需要跨时间,地区或者预算