第04章 数据库对象
删除有聚簇表的索引簇
DROP CLUSTER cluster_name INCLUDE TABLES 删除有聚簇表和有约束的索引簇
DROP CLUSTER cluster_name INCLUDE TABLES CASCADE CONSTAINTS 删除聚簇表
DROP TABLE tablename
可以象删除普通表一样删除聚簇表。一般2个表的聚簇,如果删除其中一个,聚簇没有必要存在了,所以一般删除聚簇时一起删除表(INCLUDE TABLES)。
删除簇索引
DROP INDEX indexname
簇索引可以象一般索引一样删除,然后重建。但注意,没有索引,索引簇不能使用。 索引簇信息
索引簇的信息存放于视图:dba|user_clusters和dba|user_clu_columns。
4.3.6 散列簇
概念:如果有查询:SELECT * FROM students WHERE sno=1234 通常的方法是:如果没有索引,则进行全表扫描;如果建立了索引,先查询索引,然后根据索引中记录的rowid读取相应的记录。能不能根据1234直接计算rowid,然后按rowid读取相应的记录?
散列(Hash)实质上是一种将表中一个列值或几个列的组合值计算为地址的方法(KAT:Key to Address Transformation)。计算地址的列称为散列键,散列键常常是主键或唯一键。
散列簇是将具有同一散列码值的记录存储同一数据块中,每一记录的散列值是散列函数返回的值,作为地址值,同一地址值的数据存放在同一数据块中。建立一个散列聚簇时,可指定一散列函数或使用Oracle内部的散列函数。
优点:根据散列键计算记录位置,不用查询索引获得记录位置,减少了磁盘I/O。 条件:
(1)查询是基于散列键的等值查询,而不是范围查询,形如
SELECT...WHERE cluster_key=?;
- 31 -
第04章 数据库对象
(2)静态数据表,主要用于查询,而不是增删改的表
(3)散列键经过散列函数运算的结果,具有比较均匀的数值分布。 步骤:
第一步:建立散列簇 第二步:建立散列表
注意:索引簇必须建立索引,而散列簇不能建立索引。
4.3.7 创建散列簇
创建散列簇的要素: (1)簇的类型及名称
(2)散列键及数据类型的确定,要求为NUMBER类型 (3)存放同一散列值的数据块大小(记录多少) (4)表空间
(5)存放单表还是多表 (6)不同散列值的个数 (7)散列函数:内部还是自定义 创建散列簇的语法:
CREATE CLUSTER cluster_name(column datatype[,column datatype,…])
[SIZE n{K|M}]
[TABLESPACE tablespace] [SINGLE TABLE ] HASHKEYS integer [HASH IS expression] 说明:
[SIZE n{K|M}]:同一散列值的对应数据大小,如果散列值与行一一对应,则为一行大小。 [TABLESPACE tablespace]:散列簇所在表空间 [SINGLE TABLE ]: 单表散列(散列簇中只存放一个表)
- 32 -
第04章 数据库对象
HASHKEYS integer:不同散列值的个数,如果散列值与行一一对应,则为行数。 [HASH IS expression]:HASH函数,缺省为Oracle内部函数,组合键只能使用内部函数 举例:
例1:创建散列簇
CREATE CLUSTER student_cluster(sno number(10))
SIZE 200
//每条记录的大小为200字节 //表空间 //单表散列
//散列值数,即学生记录数
//散列值为sno,散列值与行一一对应,不使用内部散列函数
TABLESPACE users SINGLE TABLE
HASHKEYS 10000 HASH IS sno 例2:创建散列表 表1:学生基本情况表 CREATE TABLE student(
sno
NUMBER(10),
sname VARCHAR2(20), ??
)CLUSTER student_cluster(sno);
4.3.8 维护散列簇
修改散列簇
ALTER CLUSTER cluster_name
但是SIZE、HASHKEYS、HASH IS参数不能修改。 删除散列簇
DROP CLUSTER cluster_name [INCLUDE TABLES][CASCADE CONSTAINTS] 同时删除散列表和约束。
- 33 -
第04章 数据库对象
4.4 视图
对于一个公司,有如下的员工表(EMP)。 dno 1 1 2 2 3 4 eno 1 2 3 4 5 6 ename A B C D E F esalary 4000 3500 1000 1200 1500 800 对于内部操作员,不能查询员工的工资;
(SELECT dno,eno,ename FROM emp;)=A
对于外部操作员,不能查询部门编号为1(领导)信息,其它员工的工资也不能查询;
(SELECT dno,eno,ename FROM emp WHERE dno<>1;)=B
如果分别建立上述要求的数据表,一是重复,产生冗余;二是当修改数据时,同时修改多个表,容易产生不一致;如果增加新的要求,又建立新表?视图(VIEW)是一种很好的解决办法。
概念:视图View是一种数据库对象,是一种命名的SQL查询语句。该SQL查询语句从一个或多个表(称为基表)查询,查询的记录形成一个“虚表”。为什么是虚表呢?Oracle只在数据字典中保存SQL语句定义,并不实际保存查询的记录,只是在使用视图的时候,按名字找到相应的SQL查询语句,然后重新执行SQL查询语句,查询的记录会随基表的更新而变化。如上面定义的A,B为视图名。可以象使用表一样使用视图。
视图和基表的关系:
区别:①基表是数据存放的地方,有实际的数据,需要存储空间。②视图中没有数据,只有一条SQL查询语句,并保存在数据字典中。
联系:①视图是一个查询语句,其结果仍是关系结构,与表的结构相同,故称为”虚表”。②一个视图可以派生于一个或多个基表,也可以从其它视图中派生,基表的数据发生变化时,视图
- 34 -
第04章 数据库对象
是从最新的数据中查询,查询结果会自动更新。③如果视图允许更新,实际更新的是基表的数据。
视图的作用:
①安全:可以只呈现用户权限范围内的数据,对基表的数据进行选择或投影后呈现给用户,保护了敏感数据,增加了安全性。视图有视图权限,对视图的操作要有相关权限。
②方便:可以封装复杂的SQL查询,简化用户的操作,也消除了不同的人所用的语句差异所造成的不一致性。
4.4.1 建立视图
CREATE [or REPLACE] [FORCE | NO FORCE] VIEW [user.]viewname
[column_name,...] AS query
[WITH CHECK OPTION] [CONSTRAINT constraint] [WITH OBJECT OID | DEFAULT] [WITH READ ONLY] 说明:
[or REPLACE]:如果同名视图存在,则替换(先删除后建立)。
[FORCE | NO FORCE]:如果基表不存在或无权限访问基表,建立一个不可使用的视图。缺省为NO FORCE。
[column_name,...]:视图的列,缺省为SQL查询的列,一般用于重新命名列。 AS query:视图对应的SQL查询语句。
[WITH CHECK OPTION]:Update和Insert更新操作必须满足视图定义。 [CONSTRAINT constraint]:对视图更新操作进行限制。
[WITH OBJECT OID|DEFAULT]:对象视图的对象类型属性,DEFAULT(缺省)主关键字标识。 [WITH READ ONLY]:只读视图。 建立视图举例:
假设有如下的基表,员工表emp
- 35 -