第04章 数据库对象
TABLESPACE indx; 例5:建立函数索引
CREATE INDEX teacher_fname_index ON teacher(UPPER(name))
TABLESPACE indx;
4.2.4 修改索引
ALTER INDEX [user.]index
说明:可以修改索引的很多参数,一般用于改名、重建、合并等操作。 例1:改名
SQL>ALTER INDEX old_index RENAME TO new_index; 例2:重建,可同时修改表空间或其它参数 SQL>ALTER INDEX teacher_name_index REBUILD;
例3:合并,相邻叶节点都有剩余空间时,可将它们存放同一个叶节点,提高空间利用率。 SQL>ALTER INDEX teacher_name_index COALESCE;
4.2.5 删除索引
DROP INDEX [user.]indexname; SQL>DROP INDEX teacher_name_index; 当一个表删除时,其上的索引自动全部删除。
4.2.6 索引信息
索引常用的信息:索引名、拥有者、表空间、依附的表名、索引的字段等。 dba|user_indexes:索引名、索引类型。
dba|user_ind_columns:索引依附的表、索引字段。 dba|user_segments:索引段的信息。
- 26 -
第04章 数据库对象
4.3 簇
簇(cluster)是表存储的可选方式,是将几个表存储一起的容器,簇分为索引簇和散列簇。
4.3.1 索引簇
有这样的设计:部门表DEPT和员工表EMP,分别单独存放,各占单独的数据段。 DEPT部门表:
DEPTNO 10 20 DNAME SALES ADMIN EMP员工表:
EMPNO 101 102 103 104 105 EMPNAME 张三 李四 王五 赵六 孙七 DEPTNO 10 20 10 10 20 经常使用如下的连接查询(花名册):
SQL>SELECT dept.dname,emp.empno,emp.empname FROM emp
JOIN dept ON (dept.deptno=emp.deptno)
SQL>SELECT dept.dname,emp.empno,emp.empname FROM emp,dept
WHERE dept.deptno=emp.deptno
连接查询是分别读取2个数据表。能不能将被连接的几个表放在一起,一次读入呢? 概念:所谓索引簇,简单地说就是把几个表放在一起,按一定公共属性混合存放。通常是把经常逻辑上在一起连接查询(连接JOIN)的表聚簇存放,使其物理存储尽量邻接。索引簇是由共享相同数据块的一组表组成,具有相同公共列的值存储在一个数据块中,当连接查询时,多个表的数据按公共值一次读入,减少了I/O,提高了性能。其中公共列称为聚簇键或聚簇码。
如果将2个表存储在一个簇中的形式为:deptno=10及其员工存储一个数据块。
- 27 -
第04章 数据库对象 DEPTNO 10 DNAME SALES EMPNAME 李四 王五 赵六 20 ADMIN EMPNAME 李四 孙七 EMPNO 102 105 EMPNO 101 103 104 优点:
(1)当连接查询时,只需要读连接的数据块,减少了磁盘/IO.
(2)相同的聚簇键无论其在各个表中对应的行有多少,只存储一次,节省了存储空间。 使用聚簇的条件:
(1)聚簇中的多个聚簇表必须有公共的列,并且经常按公共列连接查询,而不是单独查询。 (2)静态表,表中的数据基本不变,表主要用于查询,而不是用来增删改操作; 索引簇的使用步骤: 第一步:创建索引簇 第二步:将表插入簇中 第三步:建立簇索引
在使用表之前,必须创建簇索引,所以称这种簇为索引簇(index cluster)。
4.3.2 创建索引簇
创建索引簇的要素: (1)簇的类型(INDEX) (2)索引簇的名字
(3)聚簇键及数据类型和宽度 (4)存储簇的数据块大小 (5)索引簇所在的表空间
- 28 -
第04章 数据库对象
创建索引簇的语法:
CREATE CLUSTER cluster_name(column datatype[,column datatype,…]) [SIZE n{K|M}]
[TABLESPACE tablespace] [INDEX]; 其中
cluster_name为索引簇的名称
(column datatype[,column datatype,…])聚簇键
[SIZE n{K|M}]一个聚簇键值数据的平均大小,缺省为数据块大小,即一个数据块存放一个键值数据。
[TABLESPACE tablespace]簇所在表空间,缺省为用户默认表空间 [INDEX]索引簇(默认)
SQL>CREATE CLUSTER dept_cluster(dno number(10))
SIZE 1M TABLESPACE users INDEX;
4.3.3 创建聚簇表
聚簇表的建立与普通表相似,只是用关键字CLUSTER指明其存放的索引簇代替表空间。指明其聚簇键,聚簇表中的聚簇键可以与索引簇中的聚簇键不同名,但结构相同。
CREATE TABLE [user.]tablename
({column1 datatype [DEFAULT expn] [column_constraint]|[table_constraint],...) CLUSTER cluster_name(column);
如:创建DEPT部门表并存放在dept_cluster索引簇中 SQL>CREATE TABLE dept(
dno
NUMBER(10),
dname VARCHAR2(20)
)CLUSTER dept_cluster(deptno);
创建EMP员工表并存放在dept_cluster索引簇中
- 29 -
第04章 数据库对象
SQL>CREATE TABLE emp(
empno NUMBER(10), ename VARCHAR2(20), dno
NUMBER(10)
)CLUSTER dept_cluster(dno);
4.3.4 建立簇索引
建立簇索引与建立表索引相似,表索引ON TABLE改为簇索引为ON CLUSTER,自动按定义索引簇声明的聚簇键建立索引,在建立索引时不必指明索引字段。指明索引的名称和表空间。
CREATE INDEX indexname ON CLUSTER [user.]cluster
[TABLESPACE tablespace] 如:
SQL>CREATE INDEX dept_cluster_index ON CLUSTER dept_cluster
TABLESPACE indx;
4.3.5 维护索引簇
修改索引簇
ALTER CULSTER clustername 常用于修改其物理存储参数。 修改聚簇表
ALTER TABLE tablename
注意不能修改其物理存储参数,受制于聚簇。 修改簇索引
ALTER INDEX indexname
修改簇索引同修改其它索引一样。 删除索引簇 删除空的索引簇
DROP CLUSTER cluster_name
- 30 -