视图
视图是由已存在的数据,通过一定的运算规则,来获得新的数据集合.可以让用于更加灵活的自定义数据集合,以及为数据安全性提供了一种控制策略.
一. 关系视图
1. 创建关系视图
create or repacle view 视图名称 as 查询语句|关系运算;
2. 查看视图定义
select view_name,text from user_views where view_name=’视图名字’;
3. 更改视图
a) 查看视图各列的可更新情况
Select table_name,column_name,updatable,insertable,deletable
from user_updatable_columns
where table_name=’视图名字’;
b) 更改视图数据[update,insert,drop]
同表
4. 只读视图
create or repacle view 视图名称 as 查询语句
with read only
5. 创建视图约束[保证数据完整性,仅对insert/update有效]
create or repacle view 视图名称 as 查询语句
with check option
with check option实际是为视图创建了一个约束,该约束主要根据where子句条件判断,oracle将会判断修改[insert/update]后的数据是否违反了该约束,如果违反则抛出错误.
二. 对象视图
(一).对象简介
1.对象类型与对象
create or replace type as ovject(
attribute1 datatype1,
attribute2 datatype2,
…
member function functionl,
…
member procedure procedurel,
…
)
其中, Create or replace type 用于创建一个新的类型,as ovject代表新类型继承object,attribute用于定义对象类型所拥有的属性,datatype代表属性的具体类型,member function用于定义成员函数,member procedure用于定义成员过程.
eg. create or replace type employee as object(
emp_id number,
emp_name varchar2(20),
emp_job varchar2(20)
);
/
2.获得类的相关信息
select type_name,typecode,attributes from user_types;
select type_name,attr_name,attr_type_name,length from user_type_attrs;
3.根据类定义表的结构
eg. create table tmp_emp of employee;
4.把对象插入到数据表中
declare e employee;
begin
e :=employee(1,’王大’,’SALESMAN’)
insert into tmp_emp values (e);
end;
/
5.从数据到对象
declare e employee;
begin
select value(t) into e from tmp_emp t where emp_id=1;
e.emp_id:=e.emp_id +1;
insert into tmp_emp values(e);
end;
/
(二).对象视图
1.创建对象视图
create or replace view ov_emp of employee
with object oid(emp_id) as
select emp_id a_id,emp_name,emp_job from tmp_emp;
2.查看对象视图信息
select view_name,view_type from user_views where view_name='OV_EMP';
view_type代表了视图基于的对象类型.
3.查询对象视图
select * from ov_emp;
4.更新对象视图
insert into ov_emp values(3,'李二','WORKER');
以上数据会插入到视图ov_emp中以及基础表tmp_emp中.
通过对象视图,可以同时向基础表中插入数据,而此时的插入方式可以以对象实例方式实现.
三.物化视图
1.物化视图简介
物化视图的主要意义在于提高数据库性能.对比普通查询语句,利用物化视图可以大大提高执行效率,当数据表的数据更加庞大,查询语句更加复杂的时,物化视图所带来的性能上的提升将更加显著.
2.使用物化视图
(1) 创建及使用物化视图
create materialized view 物化视图名 as 视图定义
(2) 在数据字典中获得物化视图信息
select mview_name,query from user_mviews;
如果在视图user_objects中查询,会发现有与物化视图同名的数据表
select object_name,object_type,status from user_objects where .......;
在查询结果中将含有两条记录,一条标识了物化视图本身,而另一条则标识了物化视图的附属数据表.物化视图创建时,会将查询定义所获得的数据加载到附属数据表中,而当查询物化视图时,查询的对象实际是物化视图的附属数据表.
3.延时载入
create materialized view 视图名 build deffered as 视图定义;
4.数据刷新
(1) 手动刷新
exec dbms_mview.refresh('视图名');
(2) 当数据修改被提交时,自动同步数据.
alter materialized view 视图名 refresh on commit;
物化视图的数据同步将耗费大量的数据库资源,当数据频繁更新时,将给数据库带来极大的负载,所以自动同步仅仅适用于那些读取频繁,而更新较少的场景下.
对于更新频繁的场景,应当使用人工刷新的策略,即通过制定refresh on demand.
5.查询重写
(1) 定义
当进行查询时,oracle改写查询语句,搜寻其他数据源,以在保证结果的情况下提高执行效率,而这个新的数据源,往往是指物化视图.
(2) 物化视图的查询重写功能
启用:alter materialized view 视图名 enable query rewrite;
禁用:alter materialized view 视图名 disable query rewrite;
视图总结
视图特点
应用场景
关系视图
存储查询定义,可重用
封装查询,数据权限与安全控制
内嵌视图
不存储查询定义,无需维护,不可重用
临时或中间结果集,子查询
对象视图
可与对象进行相互映射,面向编程的好处
oracle面向对象编程
物化视图
存储数据,耗费数据库资源,查询重写
提高性能,查询频繁而更新较少的场景