簇由一组共享多个数据块的多个表组成,它将这些表的相关行一起存储到相同数据块中,这样可以减少查询数据所需的磁盘读取量。创建簇后,用户可以在簇中创建表,这些表称为簇表。
例如有如下两个表:student和achievement.。其中,student表存储学生信息,需要使用SID字段(存储学生ID);achievement表存储学生成绩信息,也需要使用SID字段。也就是说,student和achievement需要共享学生ID数据块。
注意:如果用户在自己的模式中创建簇,则必须具有create cluster权限和unlimited tablespace系统权限;如果想在其他模式中创建簇,则还必须具有create any cluster系统权限
创建簇和簇表
创建簇
创建簇,需要使用create cluster语句,例如创建一个名为stu_ach的簇,如下:
- create cluster stu_ach(sid number)
- pctused 40
- pctfree 10
- size 1024
- storage
- (initial 128k
- next 128k
- minextents 2
- maxextents 20
- )tablespace huizhi;
注意:size子句用来为聚簇字段提供指定的数据块数量。例如,将size设置为1024,即表明簇中的聚簇字段记录只能存储在1024个数据块中。
创建簇表
创建簇表,需要使用cluster子句指定所使用的簇和簇字段。
例如,在stu_ach簇中创建两个簇表:student和achievement。如下:
- create table student(
- sid number,
- sname varchar2(8),
- sage number
- )
- cluster stu_ach(sid);
- --表已创建
- create table achievement(
- aid number,
- score number,
- sid number
- )
- cluster stu_ach(sid);
- --表已创建
提示:将student和achievement两个表组成一个簇后,在物理上oracle会将这两个表中每个学生的学生信息和该学生的所有成绩信息存储到相同的数据块中。
现在向student表中添加记录,如下:
- insert into student values(1,'小明',24);
注意:为了能够向簇表中添加记录,还需要首先为簇建立索引。
创建簇索引
簇索引与簇表不同,它并不存在于簇中,而是与普通索引一样需要具有独立的存储空间。
例如,为簇stu_ach建立一个簇索引,如下:
- create index stu_ach_index
- on cluster stu_ach
- tablespace huizhi;
管理簇
对一个簇的管理主要是修改簇和删除簇。如果用户想要管理簇,则必须具有alter any cluster系统权限。
修改簇
修改一个簇,主要是修改簇的如下属性值:
1.物理存储属性,包括pctfree、pctused、initrans、maxtrans和storage。
2.为了存储簇键值的所有行所需空间的平均值size。
3.默认的并行度。
删除簇
1.删除一个空簇:当一个簇中不包含簇表时,删除该簇可以使用drop cluster cluster_name语句。
2.删除一个含有簇表的簇:需要使用drop cluster...including tables语句,如下
- drop cluster stu_ach including tables;
- drop cluster stu_ach including tables cascade constraints;