Chinaunix首页 | 论坛 | 博客
  • 博客访问: 640761
  • 博文数量: 198
  • 博客积分: 4256
  • 博客等级: 上校
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-15 13:12
文章分类

全部博文(198)

文章存档

2012年(12)

2011年(39)

2010年(135)

2009年(12)

我的朋友

分类: Oracle

2012-03-11 15:59:14

一个创建物化视图的例子:
1. CREATE MATERIALIZED VIEW LDY.test 
2. TABLESPACE LDY
3. PCTUSED    90
4. PCTFREE    10
5. INITRANS   2
6. MAXTRANS   4
7. STORAGE    (
8. INITIAL          8K
9. NEXT             8K
10. MINEXTENTS       1
11. MAXEXTENTS       10000
12. PCTINCREASE      0
13. BUFFER_POOL      DEFAULT)
14. CACHE
15. ENABLE ROW MOVEMENT
16. LOGGING
17. COMPRESS
18. PARALLEL ( DEGREE Default INSTANCES Default )
19. BUILD DEFERRED
20. USING INDEX
21. TABLESPACE LDY
  PCTFREE    20
  INITRANS   3
  MAXTRANS   5
  STORAGE    (
  INITIAL          20K
  NEXT             20K
  MINEXTENTS       1
  MAXEXTENTS       2000
  PCTINCREASE      0
  BUFFER_POOL      KEEP
  )
22. REFRESH FAST ON DEMAND
23. WITH PRIMARY KEY
24. FOR UPDATE
25. ENABLE QUERY REWRITE
26. AS 
27. select * from t1;
解释:
创建一个物化视图,schema为LDY,物化视图名为test。
物化视图存储使用的表空间为LDY。
PCTUSED表示如果可用的空间降低到PCTUSED属性所定义的值以下,则之前由于达到或超出PCTFREE阈值而从空闲表中删除的块将会重新添加进表中。在本地管理表空间中(LMT),使用位图进行空间管理,该参数被忽略。
PCTFREE表示在已存在的行中指出一个块需要保留百分之多少的空间用来更新。当一个块所使用的空间达到或超过PCTFREE值,则从空闲表中删除该块并不再使用这个块。
INITRANS定义在每个数据块中分配的并发事务项的初始数目。其最大值取决于块大小。如果有大量的并发操作,则可以改变这个值,而数据库也可以按照需要动态地添加事务项(默认值为1)。
在早期版本中,MAXTRANS指出允许更新给定数据块并发事务的最大数目(默认值随块大小的变化而变化)。最近的版本中,该值被自动设置为255。
STORAGE子句用于定与所创建对象相关的存储参数。
INITIAL定义表中第一个扩展区的大小。默认值为5个数据块的大小,在手动段空间管理管理的表空间中,该值最小值为2个数据块大小,在自动段空间管理的表空间(ASSM)中,该值最小值为5个数据块。其最大值由操作系统决定。如果表空间使用了uniform extents,则每个extent的大小根据表空间的定义决定。
NEXT定义表中下一个扩展区的大小。
MINEXTENTS定义分配给表的最小扩展区数目,在本地管理表空间中(LMT)中不允许对该参数进行修改。
MAXEXTENTS定义分配给表的最大扩展区数目,可以通过指定UNLIMITED ,让Oracle根据需要自动分配,在本地管理表空间中(LMT)中不允许对该参数进行修改。
PCTINCREASE定义在第2个extent操作之后NEXT参数应该增加的百分比。
BUFFER_POOL有3个参数,KEEP、RECYCLE、DEFAULT。KEEP表示将段中的块放入KKEP池,减少IO,KEEP优先于NOCACHE子句。RECYCLE表示将段中的块放入RECYCLE池,RECYCLE池可以减少不必要的cache空间。DEFAULT表示使用默认的buffer pool,不会为对象分配KEEP或RECYCLE。该参数不能用于cluster table、表空间、回滚段,但可以用于cluster。
CACHE表示将表中获得的块放在buffer cache中的最近最常使用端,该参数常用于小表的全表扫描。NOCACHE按默认方法存放,如果在storage_clause子句中的BUFFER_POOL指定了KEEP参数,则NOCACHE参数不起作用。
ENABLE ROW MOVEMENT表示激活行迁移,当做例如压缩、或update操作要分割数据时,允许行迁移,也就是允许改变rowid,默认是DISABLE ROW MOVEMENT,即不改变rowid。
LOGGING生成重做日志,更新较慢,但可恢复。NOLOGGING表示无时间记录,不生成重做日志,更新较快,但不可恢复。一般情况下,不加此项。
COMPRESS表示启用table compression,用于压缩段,减少磁盘和内存的使用。NOCOMPRESS表示不启用table compression。
PARALLEL表示配置表的并行化,没有加次项则不并行。括号内的DEGREE表示并行值,也可以用默认DEFAULT。
BUILD有两个选项,默认是IMMEDIATE,表示在创建物化视图时就生成数据,DEFERRED表示在建立时先不生成数据,在之后的刷新时才生成,第一次刷新时,是完全刷新。
USING INDEX是默认值,物化视图建立一个默认索引用于维护数据,该索引与刷新依赖的条件有关,数据库就使用默认索引来实现快速增量刷新。如果使用USING NO INDEX,则不建立默认索引,但可以通过CREATE INDEX语句之后创建。
该部分参数与之前的存储参数具有相同的含义,但是在USING INDEX子句中,不允许设置PCTUSED参数。
指当基表发生了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。如果需要进行快速刷新,需要建立物化视图日志,该日志记录DML操作的数据。如果指定了ON COMMIT,则不能指定刷新时间。当一个表TRUNCATE之后,它就不再支持快速刷新,需要对其进行一次完全刷新。
WITH可以跟PRIMARY KEY或ROWID,PRIMARY KEY要求表包含一个主键约束,根据主键刷新物化视图。当没有主键时,可以使用ROWID来刷新,但是ROWID有一些限制,如:只能基于一个单一的表,不能包含以下内容:Distinct或集合函数、GROUP BY或CONNECT BY子句、子查询、连接、集合运算。
FOR UPDATE表示允许对物化视图进行DML操作,通过高级复制可以将这些更新传播到master。默认物化视图不能进行DML操作。
QUERY REWRITE可以有ENABLE或DISABLE的状态,ENABLE表示此物化视图支持查询重写,查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
AS定义了物化视图的查询语句,如果定义为BUILD DEFERRED的物化视图,则不会立即执行该查询语句。
物化视图的SQL查询语句。
补充:
CREATE MATERIALIZED VIEW t2
ON PREBUILT TABLE
WITH REDUCED PRECISION
REFRESH FAST ON COMMIT
WITH PRIMARY KEY
AS
select id from t1;
ON PREBUILT TABLE子句将一个已存在的表注册为一个物化视图,该物化视图的名称要与该表相同。通过该子句创建的物化视图,不能再指定存储参数。当删除物化视图时,不会删除同名的表。
可以指定WITH REDUCED PRECISION或WITHOUT REDUCED PRECISION,WITH REDUCED PRECISION表示允许降低精度,WITHOUT REDUCED PRECISION表示不允许降低精度。
注意:这里的t2表是t1表的子集。如果在物化视图查询语句中,将t1改为t2,会报ORA-4020错误,具体请参考metalink文档[ID 103077.1]。
从t1表里查出的列要符合t2表的列。WITH REDUCED PRECISION允许列的精度有所差别,但任要求具有相同的类型。
CREATE MATERIALIZED VIEW t3
ON PREBUILT TABLE
WITH REDUCED PRECISION
REFRESH FAST ON demand
WITH primary key
for update
AS
select * from t1;
如果要定义一个for update的物化视图,则不能设置为on commit。并且预建表必须与master表具有相同的列、属性、精度以及相同的约束。
阅读(2427) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~