Oracle之视图和物化视图
文章目录
- Oracle之视图和物化视图
- 视图
- 优点
- 创建视图
- 带检查约束视图
- 只读视图
- 创建带错误的视图
- 删除视图
- 查询视图
- 物化视图(实体化视图)
- 区别和优点
- 创建物化视图
- 创建手动刷新的物化视图
- 执行下列语句刷新
- 创建自动刷新的物化视图
- 创建时不生成数据的物化视图
- 创建增量刷新的物化视图
- 删除物化视图
视图
视图是一种数据库对象,是从一个或者多个数据库表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。
简单来说,就是对sql语句的封装
优点
1.简化数据操作:视图可以简化用户处理数据的方式
2.着重于特定数据:不必要的数据或敏感数据可以不出现在试图中
3.视图提供了一个简单而有效的安全机制,可以制定不同用户对数据的访问权限
4.提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口
创建视图
CREATE [OR REPLACE] [FORCE] VIEW view_name
AS sebquery
[WITH CHECK OPTION]
[WITH READ ONLY]
OR REPLACE:若所创建的视图已经存在,oracle自动重建该视图
FORCE:不管基表是否存在oracle都会自动创建该视图
sebquery:一条完整的select语句,可以再该语句中定义别名
WITH CHECK OPTION:插入或修改的数据行必须满足视图定义的约束
WITH READ ONLY:该视图上不能进行任何DML操作
带检查约束视图
该视图可以查看,但插入或修改必须满足视图的约束
CREATE VIEW view_name
AS sebquery
WITH CHECK OPTION;
这里有个teacher表
# 创建约束视图
create or replace view t_view
as select * from teacher where name='zs'
with check option ;
查看视图
若修改视图中 id 为41的名字,则会报错(不能修改视图的条件值)
update t_view set name='zss' where id=41;
只读视图
只能查看,不能修改
CREATE VIEW view_name
AS sebquery
WITH READ ONLY;
创建带错误的视图
使用场景:当表动态创建时
若表不存在,但是希望创建视图,则添加可选项FORCE
CREATE FORCE VIEW view_name
AS sebquery
删除视图
DROP VIEW view_name
查询视图
select * from view_name
就像使用表一样去使用视图就可以了,对于简单的视图,我们不仅可以用查询,还可以增删改记录
物化视图(实体化视图)
视图是一个虚拟表(也可以认为是一条语句),它基于创建时指定的查询语句返回的结果集,每次访问它都会导致这个查询语句被执行一次,为了避免每次访问都执行这个查询,可以将这个查询结果存储到一个物化视图(也叫实体化视图)
区别和优点
区别:是普通视图建立的副本,类似于一张表,需要占用存储空间。
优点:对物化视图查询的执行效率与查询一个表是一样的。
创建物化视图
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED]
REFRESH [FAST|COMPLETE|FORCE]
[ON [COMMIT| DEMAND]| START WITH(start_time) NEXT(next_time)]
AS
subquery
BUILD IMMEDIATE:是在创建物化视图的时候就生成数据
BUILD DEFERRED:则在创建时不生成数据,以后根据需要再生成数据。
默认为:BUILD IMMEDIATE。
刷新(REFRESH):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。
REFRESH后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。
FAST:刷新采用增量刷新(快速刷新),只刷新自上次刷新以后进行的修改。
COMPLETE:刷新对整个物化视图进行完全的刷新。
FORCE:则Oracle在刷新时会去判断是否可以进行快速刷新。
FORCE是默认的方式。
刷新的模式有两种:ON DEMAND和ON COMMIT。
ON DEMAND:指需要手动刷新物化视图(默认)。
ON COMMIT:指在基表发生COMMIT操作时自动刷新。
创建手动刷新的物化视图
--创建手动刷新的物化视图
create materialized view view_emp
as
select emp.id,emp.name,dept.pname from emp,dept
where emp.pid=dept.pid;
直接形成表
执行下列语句刷新
C指的是COMPLETE的首字母,代表完全刷新
begin
DBMS_MVIEW.refresh(‘view_emp’,‘C’);
end;
--查询物化视图
select * from view_emp;
--向基表插入数据
insert into emp values (8,'lhh',2);
--执行下列语句刷新
begin
DBMS_MVIEW.refresh('view_emp','C');
end;
或者在命令窗口下
SQL> EXEC DBMS_MVIEW.refresh('view_emp','C');
创建自动刷新的物化视图
基表发生commit操作,自动刷新物化视图
--创建自动刷新的物化视图
create materialized view view_emp1
refresh
on commit
as
select emp.id,emp.name,dept.pname from emp,dept
where emp.pid=dept.pid;
--向基表插入数据
insert into emp values (8,'lhh',2);
创建时不生成数据的物化视图
--创建时不生成数据的物化视图
create materialized view view_emp2
build deferred
refresh
on commit
as
select emp.id,emp.name,dept.pname from emp,dept
where emp.pid=dept.pid;
--查询物化视图
select * from view_emp2;
第一次必须手动刷新
--执行下列语句刷新
begin
DBMS_MVIEW.refresh('view_emp2','C');
end;
--查询物化视图
select * from view_emp2;
创建增量刷新的物化视图
前提是必须创建物化日志
物化日志:记录基表发生了哪些变化,用这些记录去更新物化视图
有关联几个表创建几个日志
--创建物化视图日志
--根据主键创建
create materialized view log on emp with rowid ;
create materialized view log on dept with rowid;
创建物化视图的语句中,必须有基表的rowid
--创建增量刷新的物化视图
create materialized view view_emp3
refresh
fast
as
select emp.rowid erowid,dept.rowid drowid,emp.id,emp.name,dept.pname from emp,dept
where emp.pid=dept.pid;
当基表插入数值后,物化视图日志内容
SNAPTIME$$:用于表示刷新时间。
DMLTYPE$$:用于表示DML操作类型,I表示:INSERT,D表示:DELETE,U表示:UPDATE。
OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。
CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。
此列是RAW类型,其实Oracle采用的方式就是用每个BIT位去映射一个列。
插入操作显示为:FE,
删除显示为:OO
更新操作则根据更新字段的位置而显示不同的值。
当我们手动刷新物化视图后,物化视图日志被清空,物化视图更新。
删除物化视图
DROP METERIALIZED VIEW view_name