四 ORACLE 对象
4.1 视图
视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视 图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。
视图的创建
CREATE [OR REPLACE] [FORCE] VIEW view_name
AS subquery
[WITH CHECK OPTION ]
[WITH READ ONLY]
OR REPLACE
:若所创建的试图已经存在,ORACLE
自动重建该视图;FORCE
:不管基表是否存在 ORACLE 都会自动创建该视图;subquery
:一条完整的 SELECT 语句,可以在该语句中定义别名;WITH CHECK OPTION
:插入或修改的数据行必须满足视图定义的约束;WITH READ ONLY
:该视图上不能进行任何 DML 操作。
视图的删除:
drop
DROP VIEW 视图名
带检查约束的视图:
with check option
create or replace view view_address2 as
select * from T_ADDRESS where areaid=2
with check option
只读视图:
with read only
create or view view_owners1 as
select * from T_OWNERS where ownertypeid=1
with read only
带错误的视图:
force
create or view force view_owners1 as
select * from T_OWNERS where ownertypeid=1
复杂视图:,就是视图的 SQL 语句中,有聚合函数或多表关联查询
create or replace view view_owners as
select o.id 业主编号,o.name 业主名称,ot.name 业主类型
from T_OWNERS o,T_OWNERTYPE ot
where o.ownertypeid=ot.id
- 键保留表
键保留表是理解连接视图修改限制的一个基本概念。该表的主键列全部显示在视 图中,并且它们的值在视图中都是唯一且非空的。也就是说,表的键值在一个连 接视图中也是键值,那么就称这个表为键保留表。
4.2 物化视图
视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图。 物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样 的。
- 物化视图的创建
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED ]
REFRESH [FAST|COMPLETE|FORCE]
[
ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT
(next_time)
]
AS
sql语句
- 参数解释
METERIALIZED
:是在创建物化视图的时候就生成数据BUILD DEFERRED
:则在创建时不生成数据,以后根据需要再生成数据。 默认为BUILD IMMEDIATE
。REFRESH
:FAST:增量更新,COMPLETE:完全刷新,FORCE:自动选择(默认)- 刷新的模式有两种:
ON DEMAND
和ON COMMIT
。ON DEMAND
指需要 手动刷新物化视图(默认)。ON COMMIT
指在基表发生 COMMIT 操作时自动 刷新。
手动刷新物化视图
create materialized view mv_address
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id
- 当我们插入一条数据后
insert into t_address values(8,'宏福苑小区',1,1);
- 手动刷新
begin
DBMS_MVIEW.refresh('MV_ADDRESS','C');
end;
自动刷新物化视图
refresh on commit
create materialized view mv_address2
refresh
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id
创建此物化视图后,当 T_ADDRESS 表发生变化时,物化视图自动跟着改变。
创建时不生成数据
build deferred
create materialized view mv_address3
build deferred
refresh
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id;
- 第一次查询,没有数据,需要手动刷新
begin
DBMS_MVIEW.refresh('MV_ADDRESS3','C');
end;
创建增量刷新的物化视图
refresh fast
- 如果创建增量刷新的物化视图,必须首先创建物化视图日志
create materialized view log on t_address with rowid;
create materialized view log on t_area with rowid
- 创建物化视图
- 创建物化视图中涉及表的物化视图日志。
- 在查询语句中,必须包含所有表的
rowid
( 以rowid
方式建立物化视图日志
create materialized view mv_address4
refresh fast
as
select ad.rowid adrowid ,ar.rowid arrowid, ad.id,ad.name
adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id;
4.3 序列
序列是 ORACLE
提供的用于产生一系列唯一数字的数据库对象。
序列的创建
create sequence 序列名称
- 获取下一个值
select 序列名称.nextval from dual
- 获取当前值
select 序列名称.currval from dual
复杂序列
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默
认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
create sequence seq_test1
increment by 10
start with 10
maxvalue 300
minvalue 5
修改序列
ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE
删除序列
DROP SEQUENCE 序列名称
4.4 同义词
- 同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以 及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全 性。同时,同义词的易用性较好,降低了数据库用户的 SQL 语句复杂度。 同义词允许基对象重命名或者移动,这时,只需对同义词进行重定义,基于同义 词的应用程序可以继续运行而无需修改。 你可以创建公共同义词和私有同义词。其中,公共同义词属于 PUBLIC 特殊 用户组,数据库的所有用户都能访问;而私有同义词包含在特定用户的方案中, 只允许特定用户或者有基对象访问权限的用户进行访问
- 其中 synonym 表示要创建的同义词的名称,object 表示表,视图,序列等我们要 创建同义词的对象的名称。
语法
create [public] SYNONYM synooym for object;
create synonym OWNERS for T_OWNERS;
4.5 索引
- 索引是一种高效的数据结构
- 索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次 数,从而提高数据访问性能
- 索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于 下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提 到的伪列
(ROWID)
创建索引
create index 索引名 on 表名(字段)
唯一索引 如果列中的数据是唯一的,我们可以创建唯一索引,来提升查询效率
create unique index 索引名称 on 表名(列名);
复合索引
create index 索引名称 on 表名(列名,列名.....)
反向键索引 将二进制反转,在转换为10进制,达到随机分布的目的
create index 索引名称 on 表名(列名) reverse;
位图索引 基于有限的个数建立图索引
create bitmap index 索引名称 on 表名(列名)