中国开发网: 论坛: 数据库: 贴子 856428
DeepBlue: MATERALIZED VIEW(实体化视图/ 物化视图)
========================================
实体化视图 MATERALIZED VIEW
========================================

实体化视图与普通视图的区别:
普通视图是个虚表,相当一个子查询
实体化视图是将运算结果预先放到实体化视图表中了

CREATE OR REPLACE VIEW 视图名 AS 查询
SQL>CREATE OR REPLACE VIEW V_A AS SELECT SUM(SAL) SS FROM EMPLOYEE;

CREATE MATERIALIZED VIEW 实体化视图名 AS 查询
首先要给用户作CREATE MATERIALIZED VIEW的权限:
SQL>GRANT CREATE MATERIALIZED VIEW TO SCOTT
创建实体化视图:
SQL>CREATE MATERIALIZED VIEW MV_A SA SELECT SUM(SAL) FROM EMPLOYEE;

练习:
创建一个实体化视图,查询所有部门编号,人数和工资总额
然后比较从这个实体化视图上查询数据的速度和从表上查询数据的速度
SQL>CREATE MATERIALIZED VIEW MV_1 AS SELECT DEPTNO,COUNT(*),SUM(SAL) FROM EMPLOYEE GROUP BY DEPTNO;

因为实体化视图是将运算结果预先放到实体化视图表中,
所以实体化视图中的数据在不同的时刻可能会是旧数据
那么就需要对实体化视图进行刷新
a.手动刷新
SQL>EXEC DBMS_MVIEW.REFRESH('实体化视图名');
b.自动刷新
首先在表的列上,建立实体化视图日志对象,用来监视表中列值的变化
CREATE MATERIALIZED VIEW LOG ON 表名
WITH(列名列表),ROWID INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW LOG ON EMPLOYEE
WITH(SAL), ROWID INCLUDING NEW VALUES;
创建实体化视图,并且加入自动刷新选项
CREATE MATERIALIZED VIEW 实体化视图名
REFRESH FAST ON COMMIT
AS 查询;
#FAST方式不支持UPDATE。

CREATE MATERIALIZED VIEW 实体化视图名
REFRESH COMPLETE ON COMMIT
AS 查询;


删实体化视图的方法:
DROP MATERIALIZED VIEW 实体化视图名

===================
查询重写技术 QUERY REWRITE
===================
作用:
当实体化视图中的数据不准确时,Oracle会自动从表中进行查询
当实体化视图中的数据准确时,Oracle会自动从实体化视图中进行查询。
使用查询重写技术的步骤:
a.实体化视图需要支持查询重写
CREATE MATERIALIZED VIEW 实体化视图名
REFRESH COMPLETE ON COMMIT
ENABLE QUERY REWRITE
AS 查询;
b.启用查询重写功能
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;

ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;

检查某查询语句查询重写是否启用,如果未启用是什么原因的方法:
a.在当前帐户内运行以下脚本:
SQL>@%ORACLE_HOME%\RDBMS\ADMIN\UTLXRW.SQL
b.执行过程:
SQL>EXEC DBMS_MVIEW.EXPLAIN_REWRITE('查询语句');
c.执行查询:
SQL>SELECT * FROM REWRITE_TABLE; 获得信息


执行力=流程+计划+组织

把理想变成计划,
把计划变成步骤,
把步骤变成行动,
把行动变成成果。

好語說盡人必易之。規矩行盡人必繁之。福若受盡緣必孤。勢若使盡禍必至。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录