集簇是一组表的集合,这些表有一个共同的列。对表进行集簇时需要注意下面的原则:
对于应用程序连接语句中经常用在一起访问的表可以考虑创建集簇;
那些很少进行连接的表不要创建聚合;
如果应用程序经常对某个表进行全表扫描也不要创建集簇;
如果经常选择主表和子表,则要创建集簇;
如果表中具有相同的键值,但是这些键值占空间超过1个或2个数据块时,不宜创建
集簇;
如果各个键值对应的行差异太大就不宜创建集簇。
例1。下面语句创建一个集簇(cluster)名字为 personnel,它带的索引键列(cluster key column)
为department_number。一个集簇大小是512字节:
CREATE CLUSTER personnel
( department_number NUMBER(2) )
SIZE 512
STORAGE (INITIAL 100K NEXT 50K);
例2。加表到建立好的集簇里去。这里将emp和dept表加到personnel集簇中:
dept tables to the cluster:
CREATE TABLE emp
(empno NUMBER PRIMARY KEY,
ename VARCHAR2(10) NOT NULL
CHECK (ename = UPPER(ename)),
job VARCHAR2(9),
mgr NUMBER REFERENCES scott.emp(empno),
hiredate DATE
CHECK (hiredate < TO_DATE (’08-14-1998’, ’MM-DD-YYYY’)),
sal NUMBER(10,2) CHECK (sal > 500),
comm NUMBER(9,0) DEFAULT NULL,
deptno NUMBER(2) NOT NULL )
CLUSTER personnel (deptno);
CREATE TABLE dept
(deptno NUMBER(2),
dname VARCHAR2(9),
loc VARCHAR2(9))
CLUSTER personnel (deptno);
例3. 下面语句在集簇键personnel上创建一个集簇索引(cluster index)
CREATE INDEX idx_personnel ON CLUSTER personnel;
当创建完集簇索引(cluster index)后,就可以往emp和dept表中插入数据了。
Hash 簇
哈希集簇(Hash Clusters)也是一种类似于集簇表的方法。但在等价查询中比一般的索引表
或索引集簇(index cluster)还要好。
哈希集簇由一个哈希函数对每行的键值来使用表数据。所有行的相同键值在硬盘中被存放在
一起。
何时创建Hash 簇
是否创建哈希集簇,主要考虑下面原则:
对那些在使用中经常被访问的列,并且这些列经常使用等式的一组表可以创建哈希聚
合。
对于非定的集簇键,如果空间能容纳下将来所存放的所有行才能创建哈希集簇。
如果空间不足,不要考虑创建哈希集簇。
如果在应用经常采用全表扫描,则不要创建哈希集簇。
那些经常被修改集簇键值的表不宜创建哈希集簇。
创建Hash 簇
使用CREATE CLUSTER 语句再后面加 HASHKEYS 保留字就可以创建哈希集簇。见下面例子:
例1.创建哈希集簇(Hash Cluster ) :
下面语句创建一个哈希集簇名字为personnel ,集簇键列为department_number,哈希键值最大
为500字节;每个键值为512字节:
CREATE CLUSTER personnel
( department_number NUMBER )
SIZE 512 HASHKEYS 500
STORAGE (INITIAL 100K NEXT 50K);
这个例子忽略了 HASH IS 子句,这样Oracle就使用内部哈希函数来创建这个集簇。
例2.创建哈希集簇(Hash Cluster ) :
下面语句创建一个哈希集簇名字为personnel ,集簇键列由home_area_code和home_prefix组
成,并且为这两个列使用了哈希函数:
CREATE CLUSTER personnel
( home_area_code NUMBER,
home_prefix NUMBER )
HASHKEYS 20
HASH IS MOD(home_area_code + home_prefix, 101);