oracle支持两种类型的聚簇:索引聚簇和哈希聚簇
一.索引聚簇表的原理
聚簇:如果一些表有一些共同的列,则将这样一组表存储在相同的数据块中
聚簇还表示把相关的数据存储在同一个块上。利用聚簇,一个块可能包含多个表的数据。
概念上就是说如果两个表或多个表经常做连接操作,就可以预先把需要的数据也存储在一起。
聚簇还可以用于单个表,可以按某个列将数据分组存储。
简单的说,簇就是一组表,由一组共享相同数据块的多个表组成,将经常一起使用的表组合在一起成簇
就可以提高处理效率。
二.使用方法
建立的顺序:簇——>簇表——>簇索引——>数据
如下
a.创建簇
CREATE CLUSTER my_clu(
deptno NUMBER(10))
PCTUSED 60
PCTFREE 10
SIZE 1024 --
TABLESPACE USERS
storage(
INITIAL 128k
NEXT 128k
MINEXTENTS 2
MAXEXTENTS 20
);
关于size选项:size为1024表示每个聚簇键关联大约1024字节的数据(1024对于一般的表一条数据没问题)
oracle会用size这个设置来计算每个块最多能放下多少个聚簇键。假设块大小为8kb,oradcle会在每个数据块
上放做多7个聚簇键,也就是说deptno为10-60的数据会放在一个块上,一旦插入部门80,就会使用一个新块,
存放的顺序是和插入顺序相关的。
size控制着每块上聚簇键的最大个数。是对聚簇空间利用率影响最大的因素。如果size设置的过高,那么每个块
上的键就会很少(单位block可以存的聚簇键就少了),会导致不必要的使用过多的空间。如果设置的过低,又会
导致数据过分串链(一个聚簇键不够存放一条数据),就与聚簇本来的目的不符,因为聚簇原本就是为了把相关
数据都存储在一个块上
b.创建簇表
CREATE TABLE t1_dept(
deptno NUMBER(10),
dname VARCHAR2(20))
CLUSTER my_clu(deptno);
CREATE TABLE t1_emp(
empno NUMBER,
ename VARCHAR2(20),
birth_date DATE,
deptno NUMBER(10))
CLUSTER my_clu(deptno);
此时如果直接查询创建的表,将会出现提示
SELECT * FROM t1_dept; --聚簇表无法在索引建立之前使用
c.为簇创建索引
CREATE INDEX clu_index ON cluster my_clu;
j聚簇索引的任务是拿到一个聚簇键值,然后返回包含这个键的block的块地址.实际上这是一个 主键
其中每个聚簇键值指向聚簇本身中的一个块。因此,在请求deptno=10的数据时,oracle会读取聚簇键
确定相应的块地址,然后读取数据
管理聚簇
a.对于簇的修改使用alter,需要具有alter any cluster的权限
ALTER CLUSTER my_clu PCTUSED 40;
b.删除簇
drop cluster my_clu: --仅适用于删除空簇
drop cluster my_clu including tables;--删除簇和簇表
drop cluster my_clu including tables cascade constraints;--同时删除外键约束
c.清空簇
truncate cluster my_clu;
注:所有在此簇上的表的数据全部被清空
三.加载数据
向聚簇表中加载数据需要使用合理的处理方法,否则会使得聚簇的功能发挥不完全,
降低查询的效率
四.不宜使用簇的情况
1.如果预料到聚簇表会大量被修改,聚簇表会对dml的性能造成负面影响
2.非常不适合对单表的全表扫描,因为只能引起对其他表的全表扫描
3.频繁对表进行truncate操作,因为聚簇中的表是不能truncate的,只能清空(truncate)簇
4.如果簇只是欧惹人被连接或他们的公共列经常被吸怪,则不要聚簇表
5.如果经常从所有相同聚簇值得表查询出的结果的数据超过一个或两个oracle块,则不要聚簇表
6.如果空间不够,并且不能为将要插入的新纪录分配额外的空间,那么不要使用簇