文章目录
物化视图
1. 出现背景
在分布式的海量数据环境下,信息查询的速度问题显得非常重要,为此设计了物化视图(mv)
注:
提高查询速度的几种方式:
调整sga和pga;
调整sql语句,使用绑定变量(在sql语句的条件中使用变量而不是常量);
使用物化视图;
系统结构上,使用读写分离(读库、写库进行实时数据同步更新,a.在写库上使用logminer进行日志挖掘,传输到读库上,重做日志;b.在读库和写库之间使用queue)
oracle的复制技术:
物化视图、DG、消息队列
2. 简介
Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,即快照。
视图中数据不存在;物化视图数据实际存在
通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。
物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;
物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。
3. 创建选型
3.1 刷新的2种模式:
ON DEMAND 仅在该物化视图需要被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;一般需要建立一个job,在job里按照某个固定周期调用dbms_mview刷新
ON COMMIT一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
3.2 刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。
FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
COMPLETE刷新对整个物化视图进行完全的刷新。
FORCE,Oracle在刷新时首选会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式
NEVER指物化视图不进行任何刷新。
3.3 查询重写(Query Rewrite):ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种
查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
4. 基于主键的物化视图
4.1 使用条件
远程表必须包含主键
4.2 远端操作
创建主键表,并创建基于主表的视图日志
如:
远端数据库使用scott中dept表,创建视图日志:
create materialized view log on dept;
select * from user_tables;
RUPD$_视图
MLOG$_视图
4.3 本地操作
使用hr用户模拟本地数据库
SYS用户授权:
grant select on scott.dept to hr;
grant create materialized view to hr;
grant select on scott.MLOG$_DEPT to hr;
HR用户创建实体化视图:
create materialized view dept_view refresh fast start with sysdate next sysdate+1/1440 with primary key
as select * from scott.dept;
或
使用任务创建物化视图
create materialized view dept_view as select * from scott.dept;
create or replace procedure test as
begin
dbms_mview.refresh('DEPT_VIEW');
end;
/
variable job number
begin
dbms_job.submit(:job,'test;',sysdate,'sysdate+1/1440');
end;
begin
dbms_job.run(:job);
end;
远程数据库更新后,本地数据库物化视图更新:
4.4 删除物化视图
DROP MATERIALIZED VIEW DEPT_VIEW;
5. 基于rowid的物化视图
5.1 使用条件
表没有主键
5.2 远端操作
使用hr用户模拟本地数据库
创建没有主键的表,表的rowid可确定唯一一行
create table SCOTT.MVDEPT
(
deptno NUMBER(2) not null,
dname VARCHAR2(14),
loc VARCHAR2(13)
);
5.3 本地操作
使用hr用户模拟本地数据库
SYS用户授权:
授权:
grant select on scott.MVDEPT to hr;
创建实体化视图:
使用任务创建物化视图
create materialized view mvdept_view refresh with rowid as select * from scott.mvdept;
create or replace procedure test as
begin
dbms_mview.refresh('MVDEPT_VIEW');
end;
/
variable job number
begin
dbms_job.submit(:job,'test;',sysdate,'sysdate+1/1440');
end;
begin
dbms_job.run(:job);
end;
远程数据库更新后,本地数据库物化视图更新:
6. 生产环境,使用物化视图和expdp实现生产库的逻辑备份的思路
使用netca,建立一个服务,对应生产库的服务器;
使用dblink备份库连接到主库;
即可在备份库访问主库的数据,对不同的表建立物化视图;
在服务器上使用crontab定时执行脚本,执行expdp命令