Oracle中聚簇(cluster)是指:如果一组表有一些共同的列,则将这些表以“预联结”的方式存储在相同的数据块上。
聚簇还可以用于单个表,可以按某列将数据分组存储。例如部门10的所有员工都存储在同一个数据块上(如果放不下(可能是size参数设置的不合理),可以为原来的块串联另外的块)。
使用索引聚簇表的步骤:
- 创建聚簇
- 创建聚簇索引
- 在聚簇上创建表,使用cluster关键字
1.create cluster emp_cluster( deptno number(2) )
size 1024;
2.create index emp_cluster_idx on cluster emp_cluster;
3.create table emp
(empno number primary key,
ename varchar2(10),
job varchar2(9),
mgr number,
hiredate date,
sal number,
comm number,
deptno number(2))
cluster emp_cluster(deptno);
4.为索引聚簇表emp增加数据,看相同部门的数据是否存储在同一数据块上?
insert into emp select * from scott.emp;
insert into emp select empno+10000000,ename,job,mgr,hiredate,sal,comm,deptno from emp;
insert into emp select empno+20000000,ename,job,mgr,hiredate,sal,comm,deptno from emp;
insert into emp select empno+30000000,ename,job,mgr,hiredate,sal,comm,deptno from emp;
insert into emp select empno+40000000,ename,job,mgr,hiredate,sal,comm,deptno from emp;
select
dbms_rowid.rowid_block_number(emp.rowid),emp.* from emp;
由于结果数据太多,就没有罗列结果。结果显示:
在61290、61291、61292数据块上都存在部门10、20、30的员工信息,并不是像之前所说的相同部门的数据是否存储在同一数据块上。
这是因为上面我们创建cluster时指定的size=1024,
这个参数表示每个聚簇键值关联大约1024字节的数据,假设数据块为8KB,Oracle会在数据块上最多放7个聚簇键。
造成上面现象与我们加载数据的顺序有关,如果我们一次加载一个给定聚簇键的所有数据(例如,部门10的所有数据)则会尽可能的塞满当前块。因为我们加载数据是随机的,所以一开始Oracle在一个数据块上分配了3个聚簇键,由它们的数据分别填充,数据块填充满后需要开始一个新的块,由于还是随机的,所以又会分配3个聚簇键。
如果增大size的值会怎样呢?
alter cluster emp_cluster size 4096;(每个数据块存储一个聚簇键的数据,这样设置空间利用率会很低)。
insert into emp select
empno+999999999,ename,job,mgr,hiredate,sal,comm,
deptno+30 from emp;
select dbms_rowid.rowid_block_number(emp.rowid),emp.* from emp;
结果显示新增加的部门40、50、60中的数据都单独存储在一个数据块上,可见size参数对聚簇索引表的重要性!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25791987/viewspace-718272/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25791987/viewspace-718272/