索引聚簇表

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25791987/viewspace-718272/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值