Oracle 基础(物化视图)

打印 上一主题 下一主题

主题 1792|帖子 1792|积分 5376

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次

一、什么是物化视图
二、创建物化视图的语法
三、案例知识点
1.创建手动刷新的物化视图
2.创建字段刷新的物化视图,和上例一样的结果集
3.创建时不天生数据的物化视图
4.创建增量刷新的物化视图
5.创建全量刷新的物化视图


一、什么是物化视图

视图是一个假造表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被实行一次。为了克制每次访问都实行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。
而对一个物化视图查询的实行效率与查询一个表是一样的。
二、创建物化视图的语法

  1. create materialized view view_name
  2. [build immediate  |  build deferred ]
  3. refresh [fast|complete|force]
  4. [
  5. on  [commit  |  demand ]  |  start  with  (start_time)  next
  6. (next_time)
  7. ]
  8. as
  9. subquery
复制代码
    build immediate    是在创建物化视图的时候就天生数据
build deferred    则在创建时不天生数据,以后根据需要再天生数据。
默认为 build immediate。
  
刷新( refresh ):指当基表发生了 DML 操纵后,物化视图何时采用哪种方式和基表举行同步。
refresh 后跟着指定的刷新方法有三种:fast、complete、force。
fast 刷新采用增量刷新,只刷新自前次刷新以后举行的修改。
complete 刷新对整 个物化视图举行完全的刷新。
如果选择 force 方式,则 Oracle 在刷新时会去判断是否可以举行快速刷新,
如果可以则采用 fast 方式,否则采用 complete的方式
  force 是默认的方式。
  
刷新的模式有两种:on demand 和 on commit 。
on demand 指需要 手动刷新物化视图(默认)。 
on commit 指在基表发生 commit 操纵时主动刷新。
  三、案例知识点

1.创建手动刷新的物化视图

需求:查询地址 ID,地址名称和所属区域名称, 结果如下:

语句
  1. create materialized view mv_address
  2. as
  3. select ad.id, ad.name adname, ar.name ar_name
  4. from t_address ad,t_area ar
  5. where ad.areaid=ar.id
复制代码
实行上边的语句后查询
  1. select * from mv_address
复制代码
查询结果如下:

这时,我们向地址表( T_ADDRESS)中插入一条新记载,
  1. insert into t_address values(8,'宏福苑小区',1,1);
复制代码
再次实行上边的语句举行查询,会发现新插入的语句并没有出现在物化视图中。
我们需要通过下面的语句(PL/SQL),手动刷新物化视图:
  1. begin
  2.   dbms_mview.refresh('mv_address','C');
  3. end;
复制代码
2.创建字段刷新的物化视图,和上例一样的结果集

需求: 当 T_ADDRESS 表发生变化时,物化视图 主动跟着改变。
语句如下:
  1. create materialized view mv_address2
  2. refresh
  3. on commit
  4. as
  5. select ad.id,ad.name adname,ar.name ar_name
  6. from t_address ad, t_area ar
  7. where ad.areaid=ar.id
复制代码
3.创建时不天生数据的物化视图

  1. create materialized view mv_address3
  2. build deferred
  3. refresh
  4. on commit
  5. as
  6. select ad.id,ad.name adname,ar.name ar_name
  7. from t_address ad,t_area ar
  8. where ad.areaid=ar.id;
复制代码
创建后实行下列语句查询物化视图
  1. select * from mv_address3
复制代码
查询结果:

实行下列语句天生数据
  1. begin
  2.   dbms_mview.refresh('MV_ADDRESS3','C');
  3. end;
复制代码
再次查询,得到结果:

由于我们创建时指定的 on commit ,所以在修改数据后能立刻看到最新数据,无须再次实行 refresh
4.创建增量刷新的物化视图

如果创建增量刷新的物化视图,必须起首创建物化视图日记
  1. create materialized view log on t_address with rowid;
  2. create materialized view log on t_area with rowid;
复制代码
创建的物化视图日记名称为 MLOG$_表名称

创建物化视图
  1. create materialized view mv_address4
  2. refresh fast
  3. as
  4. select ad.rowid adrowid, ar.rowid arrowid, ad.id,ad.name adname,ar.name ar_name
  5. from t_address ad, t_area ar
  6. where ad.areaid=ar.id;
复制代码
留意:创建增量刷新的物化视图,必须:
1.  创建物化视图中涉及表的物化视图日记。
2.  在查询语句中,必须包罗所有表的 rowid (  以 rowid 方式建立物化视图日记 )

当我们向地址表插入数据后,物化视图日记的内容:
  1. insert into t_address values(11, '天通苑北4区', 4, 5)
复制代码

   SNAPTIME$$:用于表现刷新时间。
  DMLTYPE$$:用于表现 DML 操纵范例,I 表现 INSERT ,D 表现 DELETE ,U 表现 UPDATE。
  
OLD_NEW$$:用于表现这个值是新值还是旧值。 N(EW)表现新值,O( LD ) 表现旧值,U 表现 UPDATE 操纵。
CHANGE_VECTOR$$:表现修改矢量,用来表现被修改的是哪个或哪几个字段。
此列是 RAW 范例,其实 Oracle 采用的方式就是用每个 BIT 位去映射一个列。
插入操纵表现为:FE,  删除表现为:OO 更新操纵则根据更新字段的位置而表现不同的值。
当我们手动刷新物化视图后,物化视图日记被清空,物化视图更新。
  1. begin
  2.     DBMS_MVIEW.refresh('MV_ADDRESS4','C');
  3. end;
复制代码
案例
  1. -- todo 1 增加物化视图日志
  2. drop materialized view log on T_ADDRESS;
  3. create materialized view log on T_ADDRESS with rowid;
  4. create materialized view log on T_AREA with rowid;
  5. -- todo 2 创建增量物化视图: 地址id 地址名称 区域名称
  6. create materialized view mv_addr_5
  7.     refresh fast
  8. as
  9. select
  10.     t1.ROWID as addr_rowid,
  11.     t2.ROWID as area_rowid,
  12.     t1.id,
  13.     t1.name addr_name,
  14.     t2.name area_name
  15. from T_ADDRESS t1, T_AREA t2
  16. where t1.AREAID=t2.id
  17. ;
  18. -- todo 3 添加一个新的地址
  19. insert into T_ADDRESS values(10, '天通苑4区', 2, 1);
  20. commit;
  21. delete from T_ADDRESS where id=8;
  22. delete from T_ADDRESS where id=9;
  23. commit;
  24. -- todo 4 查看日志
  25. -- todo 5 刷新
  26. begin
  27.     DBMS_MVIEW.refresh('mv_addr_5','C');
  28. end;
  29. -- todo 6 验证
  30. select * from mv_addr_5;
复制代码
5.创建全量刷新的物化视图

  1. -- todo 1 创建全量物化视图: 统计每个区域的地址数量
  2. create materialized view mv_addr_7
  3.     refresh
  4.     on commit
  5. as
  6. select
  7.     areaid,
  8.     count(1) as cnt
  9. from t_address
  10. group by areaid
  11. ;
  12. -- todo 2 添加数据 测试
  13. insert into T_ADDRESS values(11, '天通苑5区', 2, 1);
  14. commit;
  15. -- 3 验证
  16. select * from mv_addr_6;
复制代码














免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表