优势
可以提高性能:
通过预先计算好答案存储起来,可以大大地减少机器的负载。
特点如下:
更少的物理读--扫描更少的数据
更少的写--不用经常排序和聚集
减少CPU的消耗--不用对数据进行聚集计算和函数调用
显著地加快响应时间--在使用物化视图查询数据时(与主表相反),将会很快的返回查询结果
缺点
物化视图会增加对磁盘资源的需求,即需要永久分配的硬盘空间给物化视图来存储数据。
物化视图用于只读或者“精读”环境下工作最好 ,不用于联机事务处理系统(OLTP)环境
物化视图的设置
系统级:通过INIT.ORA
会话级:通过alter session命令
设置参数如下:
query_rewrite_enabled--此参数设置为true,则表示会发生查询重写;当为false,则不会发生查询重写;
query_rewrite_integrity--此参数是控制oracle如何重写查询,且可能设置为下面的三种值:
enforced--仅仅使那些由oracle强迫和保证的约束以及规则的查询可以重写;
但由于oralce不强加一些可以通过oralce知道其他的推论关系的查询的关系;
trusted--使用oralce强加的约束,以及任意关系存在于数据中的而非数据库强加的关系可以重写查询;
stale_tolerated--使用物化视图可以重写查询,即使oralce知道包含的数据是陈旧的。
query_rewrite_enabled=false,
oracle对SQL语句进行分析与优化;
query_rewrite_enabled=true,
oracle通过起用查询重写功能,在分析过SQL语句之后,oracle将多一个步骤重写此查询以访问某些物化视图,而不是它 所参照的真正的表。
如果能够执行查询重写,这些重写的查询就被分析,并与初始查询一起优化,从数据字典所发现的可利用的物化视图的集合中执行成本最低的查询方案,这样的查询成本最低;
如果不能重写此查询,就对原始分析的查询进行优化,并正常运行;
1、查询重写的步骤:
完全精确的正文匹配->部分正文匹配->一般查询重写方法(要求数据充足并且连接兼容)->分组兼容性->聚集兼容性
2、如何确保物化视图可以使用?
这里只讲三种方法来帮助使用物化视图的查询重写功能:
1)约束;
2)维数;
3)描述复杂关系-数据层次结构;
下面是对上面三种方法举例说明:
1)约束:
SQL> create table emp as select * from scott.emp;
SQL> create table dept as select * from scott.dept;
SQL>grant query rewrite to demo;
SQL> alter session set query_rewrite_enabled=true;
SQL> alter session set query_rewrite_integrity=enforced;
SQL> create materialized view emp_dept
2 build immediate
3 refresh on demand
4 enable query rewrite as
5 select dept.deptno,dept.dname,count(*)
6 from emp,dept
7 where emp.deptno = dept.deptno
8 group by dept.deptno,dept.dname;
SQL> alter table dept add
2 constraint dept_pk primary key(deptno);
SQL> alter table emp
2 add constraint emp_fk_dept
3 foreign key(deptno) references dept(deptno);
SQL>table emp drop constraint emp_fk_dept;
SQL> alter table dept drop constraint dept_pk;
SQL> alter table emp modify deptno null;
下面是装入数据过程,假设装入了一条数据:
SQL> insert into emp (empno,deptno) values ( 2, 2);
SQL> commit;
下面是告诉oracle刷新物化视图:
SQL> exec dbms_mview.refresh( ''EMP_DEPT'' );
这个时候告诉oracle有关emp和dept表之间的关系:
SQL> alter table dept
2 add constraint dept_pk primary key(deptno)
3 rely enable NOVALIDATE ;
SQL> alter table emp
2 add constraint emp_fk_dept
3 foreign key(deptno) references dept(deptno)
4 rely enable NOVALIDATE ;
SQL> alter table emp modify deptno not null NOVALIDATE;
上面的语句中有rely enable NOVALIDATE以及NOVALIDATE表示告诉oracle不必不再对装入的已有数据的检查,并且rely告诉oracle要相信
数据的完整性,即告知oracle相信如果将emp和dept表连起来, 将检索emp表的每一行。
事实上对oracle说的并不是事实,有一条新插入emp的数据在dept中并没有对应的行,违反了数据的完整性。
如果设置alter session set query_rewrite_integrity=enforced;
则下面:
SQL> alter session set query_rewrite_integrity=enforced;
SQL> select count(*) from emp;
COUNT(*)
----------
15
Elapsed: 00:00:00.40
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF ''EMP'' (Cost=2 Card=654)
Statistics
----------------------------------------------------------
288 recursive calls
38 db block gets
77 consistent gets
0 physical reads
6752 redo size
379 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
9 sorts (memory)
0 sorts (disk)
1 rows processed
分析:当query_rewrite_integrity=enforced时,只有使那些由oracle强迫
和保证的约束以及规则的查询才可以重写 ,上面尽管建了约束,但是这个约束并没有
核实,而且并没有被数据库自己所确认,所以该语句并没有查询重写rely enable NOVALIDATE以及NOVALIDATE
表示告诉oracle不必不再对装入的已有数据的检查,实质就是数据库自己并没有确认,所以并不是
由oracle强迫和保证的约束以及规则的查询
SQL> alter session set query_rewrite_integrity=trusted;
SQL> select count(*) from emp;
COUNT(*)
----------
14
Elapsed: 00:00:00.30
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=13)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF ''EMP_DEPT'' (Cost=2 Card=82 Bytes=
1066)
Statistics
----------------------------------------------------------
20 recursive calls
1 db block gets
17 consistent gets
1 physical reads
100 redo size
379 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
1 rows processed
设置了query_rewrite_integrity=trusted,告诉oracle使用oralce强加的约束,
以及任意关系存在于数据中的而非数据库强加的关系可以重写查询,设置过后数据库
认为数据中有非数据库强加的emp和dept表之间的关系存在,则数据库认为可以采用
查询重写,使用物化视图。此时oracle对新插入的数据认为是违反了的emp和dept表之间
约束的关系,所以并没有对新插入的行的做记数,及时物化视图做刷新,也没有将新插入
的数据加到物化视图中去,oracle认识到我们告诉他的数据不可靠, 可以知道:
1、对于大型数据仓库可以非常相信物化视图,不必自己再做的量数据的校验;
2、如果你要你想要的数据,必须自己一确保数据的可靠,100%的净化了数据;