8i和8i前,oracle 提供了 快照 snapshot ,9i中把其改名为物化视图,也叫实体化视图 materialized View。
在海量数据中,如果只想查询特定的数据,通常会select 基表或者视图,而查询视图是通过基表进行查询的。如果基表数据的数量级非常之大,那么对于只想查询特定的数据时效率就会很不尽人意。传统的视图是逻辑上的。而物化视图是存在磁盘空间里的。他是远端数据库在本地上的一个副本,或者用来生成数据库表求和的汇总表。物化视图存储基于远程表的数据,也可以移位快照。物化视图可以在 基表,视图,其他物化视图中来建立。通常在物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。
想提高查询速度,数据库性能调整重点
1.调整SGA 和PGA
2.调整SQL语句,使用绑定变量
3.使用物化视图
4.系统结构上要读写分离。用两个数据库读库和写库,读库和写库数据时时同步,读库专门用来查询,写库专门用来写入。
对于普通复制,本地数据库的物化视图只可读.
如果要创建基于主键的物化视图,则必须具有访问主表和访问主表的日志 和 Create Materialized View 这三个权限。
如果是创建基于Rowid的物化视图,则需要访问主表和 Create Materialized View 这两个权限
查询重写,Enable Query Rewrite,允许对基表进行查询时,可以直接查询物化视图。
物化视图日志,如果需要快速刷新,则需要建立物化视图日志,物化视图日志根据不同物化视图的快速刷新的需要,可以建立Rowid和Primary Key类型的
刷新,当基表发生了DML操作时,物化视图采用哪种方式和基表进行同步,模式有两种On Demand(用户需要时刷新,缺省值)和On Commit(DML提交时刷新) , 方法有四种 Fast ,Complete,Force ,Never。可以通过Job定时刷新,还可以手工刷新
例如
在远端数据库中创建一个有主键的表
-- Create table
create table STUDENT
(
sno NUMBER(6) not null,
sname VARCHAR2(10),
deptno CHAR(3)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table STUDENT
add primary key (SNO)
using index
tablespace SYSTEM
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
alter table STUDENT
add constraint DEP_DEPARTMENT foreign key (DEPTNO)
references DEPARTMENT (DEPTNO);
创建物化视图日志
create materialized view log on student;
给用户赋予权限
grant select on student to voapd; ---允许访问基表
grant create materialized view to voapd; ----允许创建物化视图
grant select on MLOG$_STUDENT to voapd; ----允许访问物化视图日志
之后再本地数据库voapd中创建物化视图 (注:不要在右侧添加注释):
-- fast 的刷新方式
--- 从现在开始
--- 每隔 1/1440天即1分钟以后 刷新
create materialized view mv_student
refresh fast
start with sysdate
next sysdate + 1/1440
with primary key
as
select * from system.student where deptno = '001';
此时在远端数据库插入一条记录,过1分钟后可以在本地数据库中查看到信息
删除物化视图;
drop materialized view mv_student ;
重新创建,用任务的方式创建:
create materialized view mv_student
as
select * from system.student where deptno = '001';
create or replace procedure test
Authid Current_User is
begin
dbms_mview.refresh('mv_student');
end;
/
variable job1 number;
begin
dbms_job.submit(:job1,'test;',sysdate,'sysdate+1');
end;
/
begin
dbms_job.run(:job1);
end;
/
--------------------------
删除表,重新建立 on commit 的物化视图
还需要权限:
GRANT ON COMMIT REFRESH to voapd;
create materialized view mv_allstudent
refresh fast on commit
as select * from system.student;