ORACLE创建cluster表,说是话我觉得这个没什么用,很少用到吧。
创建cluster表:
1、创建一个集群
create cluster my_cls (deptno number(2));
这个时候数据库做了什么?定义了一个对象,名字是my_cls,cluster key是deptno
create index my_cls_idx on cluster my_cls;
创建cluster index的目的是拿到一个index值,然后返回包含这个键的块的块地址! 。比如说我要获取deptno=20部门的数据时,oracle就会扫描这个索引,确定deptno=10这些数据的块地址
create table c_dept cluster my_cls(deptno) as select * from dept;
创建表,并且把表和集群my_cls使用deptno关联起来,存储数据的时候就不是14条记录存储在一起,而且根据deptno分类,如deptno=10的,放到一个数据块里面,deptno=20的,放到另外一个数据块里面
create table c_emp cluster my_cls(deptno) as select * from emp;
再次创建表又和my_cls关联起来,那么存储数据的时候根据emp中的deptno分类存储,从索引my_cls_idx中知道了deptno=10的那些数据放到了xx块上面,然后自己在emp中deptno为10的数据也放到那个数据块中
--查看c_dept表中的数据放到哪个块上面
select dbms_rowid.rowid_block_number(rowid),count(*) from c_dept
group by dbms_rowid.rowid_block_number(rowid);
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) COUNT(*)
------------------------------------ ----------
303 1
299 1
301 1
302 1
发现,c_dept中的数据不是放到一个块的,而是放到4个块上面
--同样查看c_emp的数据分布
--查看一下c_dept表的那些记录在那个块上面
SQL> /
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) COUNT(*)
------------------------------------ ----------
303 6
301 3
302 5
发现他们都是在同一个数据块
select * from c_dept where dbms_rowid.rowid_block_number(rowid)=303; --查看一下c_dept表中存放在303块上的数据有哪些
select * from c_emp where dbms_rowid.rowid_block_number(rowid)=303; --这些数据应该是deptno为多少的数据
===============================
验证性能上的提升
set autot traceo
select * from c_emp,c_dept where c_emp.deptno=c_dept.deptno and c_emp.deptno=10;
这个语句多执行几次,目的是消除其它池对他的影响
alter system flush buffer_cache;
select * from c_emp,c_dept where c_emp.deptno=c_dept.deptno and c_emp.deptno=10;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
2 physical reads
0 redo size
1194 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
使用相同的办法对比普通表的情况