ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引聚簇表

索引聚簇表

原创 Linux操作系统 作者:Jack_Miller 时间:2012-03-10 15:01:03 0 删除 编辑
Oracle中聚簇(cluster)是指:如果一组表有一些共同的列,则将这些表以“预联结”的方式存储在相同的数据块上。

聚簇还可以用于单个表,可以按某列将数据分组存储。例如部门10的所有员工都存储在同一个数据块上(如果放不下(可能是size参数设置的不合理),可以为原来的块串联另外的块)。

使用索引聚簇表的步骤:
  1. 创建聚簇
  2. 创建聚簇索引
  3. 在聚簇上创建表,使用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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: log_archive_format
请登录后发表评论 登录
全部评论

注册时间:2011-12-09

  • 博文量
    25
  • 访问量
    68416