oracle的簇与簇表

簇由一组共享多个数据块的多个表组成,它将这些表的相关行一起存储到相同数据块中,这样可以减少查询数据所需的磁盘读取量。创建簇后,用户可以在簇中创建表,这些表称为簇表。

例如有如下两个表: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;
上面创建簇stu_ach时,指定通过SID字段来对簇中的表进行聚簇存储,这个SID字段就可以称之为聚簇字段。
注意: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表时,使用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;
上例为簇stu_ach建立了一个名为stu_ach_index的簇索引。创建簇索引后,就可以向簇表中添加记录了。

管理簇

对一个簇的管理主要是修改簇和删除簇。如果用户想要管理簇,则必须具有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...including tables cascade constraints语句删除该簇。如下:
drop cluster stu_ach including tables cascade constraints;










你可能感兴趣的:(oracle簇与簇表)