表簇(table cluster)
一、什么是表簇?
表簇就是一组具备公共列的表。通常,一个数据块只能存储一个表的记录,在表簇中,一个数据库块可以存储多个表的记录。表簇中表的公共列叫做簇键(cluster key),簇键的值叫做簇键值。由于簇键是多个表的公共列,所以一个簇键值只存储一次,不论簇键值在各表中出现多少次。
存储结构:
二、表簇优点
(1)对于被聚簇表的联接,如上图所示,他们在存储时就已经‘预联结了’,这样可以减少磁盘 I/O。
(2)对于被聚簇表的联接,可以提高访问速度。
(3)只需更少的空间来存储相关的表和索引数据,因为簇键值不会为每行重复存储。
三、不适合用表簇的情况
(1)会经常被更新的表。
(2)经常需要全表扫描的
(3)需要被截断的表。簇可以截断,但是簇中的表不能截断,因为截断意味着要把表所在块设为可覆盖,这肯定是不行的。
四、表簇相关操作
(1). 建立用户,授权
SYS> create tablespace cluster1 datafile '/u01/oradata2/hx/cluster.dbf' size 50M;
SYS> create user cluster1 identified by cluster1 default tablespace cluster1 quota unlimited on cluster1;
SYS> grant connect,resource,create any cluster,alter any cluster to cluster1;
SYS> conn cluster1/cluster1
2.建立表簇
CREATE CLUSTER emp_dept (deptno NUMBER(3))
SIZE 1024
TABLESPACE cluster1
STORAGE (INITIAL 200K
NEXT 300K
MINEXTENTS 2
PCTINCREASE 33);
SIZE说明:SIZE表示我们希望为每个簇键值关联的字节数,假设块大小为8k,size设置为1024,那么一个块最多可以是7个簇键(当然还要考虑pcfree),插入第八个簇键时需要用新的块。如果这个值过大,单个数据块能存储的簇键变少,如果size值过小,可能还不够存放一条记录,这个时候数据溢出部分需要存储在串联的新块上,所以需要根据实际情况进行设置。需要注意,数据大小个数据插入顺序都会影响块上簇键的个数和数据表之间的聚合度。
3.在表簇上建立表
建立簇表时,一般不用指定表空间和pcfree等信息,因为这些信息在建簇时就已经指定,只需要映射属性到簇键即可
CREATE TABLE dept (
deptno NUMBER(3) PRIMARY KEY,
dname VARCHAR2(15) NOT NULL,
LOC VARCHAR2(15))
CLUSTER emp_dept (deptno);
CREATE TABLE emp (
empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
deptno NUMBER(3) REFERENCES dept)
CLUSTER emp_dept (deptno);
cluster1@HX> insert into dept values(100,'sales','boston');
insert into dept values(100,'sales','boston')
*
ERROR at line 1:
ORA-02032: 聚簇表无法在簇索引建立之前使用
4.使用前需要为簇建立索引:
CREATE INDEX emp_dept_index
ON CLUSTER emp_dept
TABLESPACE cluster1
STORAGE (INITIAL 50K
NEXT 50K
MINEXTENTS 2
MAXEXTENTS 10
PCTINCREASE 33);
cluster1@HX> SELECT segment_name,SEGMENT_TYPE,SEGMENT_SUBTYPE FROM user_segments;
SEGMENT_NAME |SEGMENT_TYPE |SEGMENT_SU
-------------------------|------------------|----------
EMP_DEPT |CLUSTER |ASSM
SYS_C0037116 |INDEX |ASSM
SYS_C0037118 |INDEX |ASSM
EMP_DEPT_INDEX |INDEX |ASSM
簇索引的作用:插入数据时,数据库在物理上把每个部门的所有行存储在相同的数据块中,数据库以堆形式存储行,并使用索引定位。普通B树索引把键值和rowid关联,而B树簇索引把簇键值与数据所在块的数据库块地址 (DBA) 关