CUUG oracle物化视图讲解

1、视图是什么?
普通视图:只是存放在数据字典当中的子查询,本身没有来源于基表

Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。

 

  物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。

 

  物化视图可以查询表,视图和其它的物化视图。

 

  通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。

  对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。

  对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。

在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。

 

物化视图由于是物理真实存在的,故可以创建索引。


2、物化视图
   把查询到的数据存放起来,为了以后再次查询,有自己的数据
   好处:
   1.再次查询就很方便
   2.省去查询中所需要的数据的处理流程
  
   缺点:
   1.需要额外空间
  
   刷新模式:
   完全刷新:新truncate ,再执行查询
   fast刷新:根据物化视图log的记录,只刷新改变的数据
  
  
3、创建一个能够快速刷新的物化视图,要求物化视图能够消除表中的重复值


create table tm1(c1 int,c2 int, c3 int);
insert into tm1 values(1,2,3);
insert into tm1 values(2,2,3);
insert into tm1 values(4,2,9);
insert into tm1 values(1,2,3);
insert into tm1 values(1,6,7);

 

SQL> create materialized view log on tm1
  2  with rowid,sequence(C1,C2,C3)
  3  including new values;

实体化视图日志已创建。

如果是update 和delete 操作,需要在子查询中添加count(*)c才支持立刻更新,默认是on demand

create materialized view MV_2
refresh fash on commit
as select c1,c2,count(*)
from tm1
group by c1,c2;

什么是查询重写
查询重写就是把访问基表的查询修改写成访问物化视图,从而提高查询速度 特点:无需改变应用程序的代码,只需要创建一个允许查询重写的物化视图

重写的意思是:把访问基表的查询修改成访问物化视图
/*NOREWRITE*/


QUERY_REWRITE_ENABLED 初始化参数必须设置
成 TRUE.
? 查询重写权限允许用户在查询的时候使用物化视图.
? DBMS_OLAP 包允许物化视图作为参数传入.


查询重写实例
SQL> create MATERIALIZED VIEW sales_summary
2 tablespace data
3 parallel (degree 4)
4 BUILD IMMEDIATE REFRESH FAST
5 ENABLE QUERY REWRITE
6 AS
7 select p.prod_name, sum(s.quantity_sold),
8 sum(s.amount_sold)
9 from sales s, products p
10 where s.prod_id = p.prod_id
11 group by p.prod_name;


查询重写实例
SQL> select p.prod_name, sum(s.quantity_sold),
2 sum(s.amount_sold)
3 from sales s, products p
4 where s.prod_id = p.prod_id
5 group by p.prod_name;
SQL> select p.prod_name, sum(s.quantity_sold),
2 sum(s.amount_sold)
3 from sales s, products p
4 where s.prod_id = p.prod_id
5 group by p.prod_name;
OPERATION NAME
---------------------- -----------------
SELECT STATEMENT
TABLE ACCESS FULL SALES_SUMMARY


查询重写控制
? 初始化参数:
– OPTIMIZER_MODE
– QUERY_REWRITE_ENABLED
– QUERY_REWRITE_INTEGRITY
? 动态和会话级别参数:
– QUERY_REWRITE_ENABLED
– QUERY_REWRITE_INTEGRITY
? 新的暗示(hint): REWRITE 和NOREWRITE

 


禁用查询重写实例
SQL> select /*+ NOREWRITE */
2 p.prod_name, sum(s.quantity_sold),
3 sum(s.amount_sold)
4 from sales s, products p
5 where s.prod_id = p.prod_id
6 group by p.prod_name;
SQL> select /*+ NOREWRITE */
2 p.prod_name, sum(s.quantity_sold),
3 sum(s.amount_sold)
4 from sales s, products p
5 where s.prod_id = p.prod_id
6 group by p.prod_name;
OPERATION NAME
----------------------------- -----------
SELECT STATEMENT
SORT
HASH JOIN
TABLE ACCESS PRODUCTS
. . .
OPERATION NAME
----------------------------- -----------
SELECT STATEMENT
SORT
HASH JOIN
TABLE ACCESS PRODUCTS

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/500314/viewspace-1067081/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/500314/viewspace-1067081/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值