/* Oracle物化视图 */ /* 为什么要使用物化视图? 物化视图作为sql调优的一种手段广泛用在数据仓库环境下。 大量的长查询语句,处理的不好,就会引起严重的I/O问题。 */ /* 什么是物化视图? 物化视图和普通视图相对应,在Oracle使用普通视图时会重复执行创建视图的所有语句。 物化视图简单来说就是具有物理存储的特殊视图,占物理空间就像表一样。 物化视图基于表、物化视图等创建,需要和源表进行同步,不断刷新新物化视图中的数据。 两个重要概念:查询重写和物化视图同步 */ /* 物化视图的特点? 1、物化视图可用于预先计算并保存表连接或聚集等消耗较多的操作结果,这样在这执行2查询的时候就可以避免进行这些耗时的操作,快速得到结果。 2、使用物化视图可以提高查询性能。 3、物化视图对应用透明,即增加和删除物化视图不会对应用程序中正执行的SQL语句带来影响。 4、物化视图需要占用存储空间,当基表发生变化时,物化视图也需要刷新。 5、物化视图还支持通过数据库链来做数据复制; */ /* 物化视图可分为三种类型: 包含聚集的物化视图 只包含连接的物化视图 嵌套物化视图 */ /* 物化视图的创建方式 BUILD IMMEDIATE 在创建物化视图时生成数据 BUILD DEFERRED 在创建物化视图时不生成数据以后根据需要生成数据 默认的创建方式是:BUILD IMMEDIATE */ /* 物化视图的查询重写 什么是查询重写? 对SQL语句进行重写。当用户使用SQL语句对基表进行查询时,如果已经建立了基于这些基表的物化视图,Oracle将自动计算和使用物化视图来完成查询。在某些情况下可以节约查询时间,减少系统I/O,Oracle的这种查询优化技术成为查询重写. ENABLE QUERY REWRITE DISABLE QUERY REWRITE 是否支持查询重写 查看命令: show parameter query_rewrite_enabled; */ /* 刷新 当基表发生了DML操作后即当基表发生变化时,物化视图需要同步数据以更新物化视图中的数据。 ON DEMAND:物化视图可以再用户需要的时候进行刷新,可以手动通过DBMS_MVIEW.refresh,可以通过JOB定时刷新。 ON COMMIT:物化视图在对基表的DML操作事务提交的同时进行刷新. 选择刷新方式后还需要选择刷新类型,刷新的类型有四种: FAST【增量刷新,只刷新上次以后的修改】, COMPLETE【整个刷新物化视图】, FORCE【Oracle在刷新是会判断是否可以快速刷新,可以就使用FAST,不可以则使用COMPLETE】, NEVE【不会对视图进行任何刷新】 默认值是 FORCE ON DEMAND即在需要的时候进行快速刷新 */ /* 物化视图日志 如果需要快速刷新,则需要建立物化视图日志,物化视图日志根据不同物化视图的快速刷新的需要,可以建立为 ROWID或者PRIMARY KEY类型的,还可以选择是否 包括SEQUENCE,INCLUDING NEW VALUE以及指定列的列表。 物化视图日志可以记录主表被更新的记录的主键、ROWID或者标识对象或者全部。 物化视图也支持带子查询的物化视图的快速刷新。 物化视图日志表明为MLOG$_后面跟主体对象的名称。 虽然主键物化视图日志和ROWID物化视图日志的差别很小,但是这些差别在实际使用中有着很大的影响。 */ /* 在建立物化视图时可以指定ORDER BY语句,使生成的数据按照一定的顺序保存,但是这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。 */ /* ONPREBUILDTABLE语句将物化视图建立在一个已经存在的表上, 此时。物化视图必须和表必须同名。当删除物化视图时不会删除同名的表。 这种物化视图的查询重写要求参数 QUERY_REWRITE_INTEGRITY必须设置为trusted或者stale_tolerated */ /*物化视图的使用*/ --例子1 /*在用户mv1查询scott用户的emp表,并在mv1下能获取到scott.emp的实时更新*/ sqlplus / as sysdba create user mv1 identified by oracle;--创建mv1用户 grant connect,resource to mv1;--给mv1授权 grant select on scott.emp to mv1;--将查询scott.emp grant create materialized view to mv1;--把物化视图的权限授予mv1 grant execute on dbms_mview to mv1; conn mv1/oracle select * from scott.emp;--测试在mv1下是否能查询scott的emp表 create materialized view emp as select * from scott.emp;--在mv1下创建物化视图 select * from emp;--测试创建的物化试图 --打开新终端对scott的emp表进行更新 update emp set sal=sal-2; commit; --此时scott中emp表sal字段已更新,但是mv1中的物化视图没有同步 --因为还没有定义同步方式 conn mv1/oracle --人工同步 exect dbms_mview.refresh('emp','c');--c表示采用COMPLETE完全刷新 --完全刷新相当于把原来表中的数据完全删掉 --可以使用FAST快速刷新, exec dbms_mview.refresh('emp','f'); /* 提示如下错误 BEGIN dbms_mview.refresh('emp','f'); END; * 第 1 行出现错误: ORA-23413: 表 "SCOTT"."EMP" 不带实体化视图日志 ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2558 ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2771 ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2740 ORA-06512: 在 line 1 */ --没有创建物化视图日志 --物化视图日志是用户选择了FAST刷新类型时要使用的,以增量同步基表的变化 conn / as sysdba grant create materialized view to scott; conn scott/123 create materialized view log on emp; grant on commit refresh on scott.emp to mv1; conn mv1/oracle drop materialized view emp; conn / as sysdba grant select any table to mv1;--不做这个授权在mv1下创建刷新视图可能提示表或视图不存在 create materialized view emp refresh fast on commit as select * from scott.emp; --测试成功!修改scott用户下的emp表,在mv1用户下查询视图emp同步更新 --创建一个每个一分钟刷新的物化视图 create materialized view empf refresh fast start with sysdate next sysdate+1/1440 as select * from scott.emp; --创建一个可更新的物化视图 create materialized view empu refresh fast for update as select * from scott.emp; --例子2 /* 同步远程数据库某个表的数据 远程数据库名:username 密码:password SID:CPEES 需同步的表:table1 */ --创建DB_LINK create DATABASE LINK to_cpees CONNECT TP "username" indentified by "password" using "CPEES" --在远程数据库上表上建快速刷新日志 create materialized view log on table1 with primary key including new values; --在本地创建物化视图 create materialized view table1 build immediate --创建物化视图时生成数据 refresh fast with primary key --根据主表主键增量快速刷新 on demand --在用户需要时由用户刷新 enable query rewrite --可读写 as select * from table1@to_cpees; --查询语句 --每月不定时刷新 create or replace procdure p_mview_refresh as begin dbms_mview.refresh('table1','f'); end p_mview_refresh; --注意:1、如果需要同时刷新多个物化视图,必须用逗号把各个物化视图名称连接起来,并对每个视图都要指明刷新方式(f、增量刷新,c、完全刷新,?、强制刷新)。例如:dbms_mview.refresh('table1,table2','ff'); -- 2、当日志和物化视图创建好后,删除日志,则需要重新创建新的物化视图,否则无法使用增量刷新 -- 3、主键更新,表必须有主键 --关于删除 -- 删除是日志和物化视图要分开删除 DROP MATERIALIZED VIEW LOG ON table1@TOCPEES; DROP MATERIALIZED VIEW table1; /* 其他概念: 物化视图可以进行分区。 物化视图是包括一个查询结果的数据库对象,是远程数据的本地副本,或者用来生成基于数据表求和的汇总表。 物化视图存储基于远程表的数据也可以称为快照。 物化视图可以基于表、视图和其他物化视图查询。 关于复制:物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果想修改本地副本必须使用高级复制功能。 当你像从一个表或视图中抽取数据时,可以从物化视图中抽取。对于数据仓库,创建物化视图通常情况下是聚合视图,单一表聚合和连接视图。 */
转载于:https://www.cnblogs.com/pzx-java/p/7284436.html