1
数据库原理与应用技术
1.5.6.3 4.6.3 聚簇设计
4.6.3 聚簇设计

为了提高某个属性(或属性组)的查询速度,可把这个(这些)属性(称为聚簇码)上具有相同值的元组集中存放在一个物理块或连续的物理块内,这种技术手段称为聚簇(Cluster)。

典型的关系数据库管理系统(如Oracle)一般允许按某一聚簇码(Cluster Key)集中存放元组,具有同一聚簇码值的元组,尽量放在同一物理块中。如果放不下,可以向邻近的区域发展,或链接多个物理块,如图4-27所示。聚簇后的元组像葡萄一样按串“聚簇”存放起来。

图4-27 元组的聚簇

1. 聚簇的用途

(1) 聚簇可以大大提高按聚簇码进行查询的效率。假设学生关系按所在系建有索引,现在要查询信息系的所有学生名单。若信息系的500名学生分布在500个不同的物理块上,则至少要执行500次I/O操作。如果将同一个系的学生元组集中存放,每读一个物理块可得到多个满足查询条件的元组,从而显著减少了访问磁盘的次数。若一个物理块能存放250个学生元组,则信息系的学生元组只要存放在相邻的2个物理块内,此时访问数据块只需2次I/O操作,这样速度会快得多。

(2) 聚簇还可节省存储空间,因为聚簇码只需在一个物理块中存放一次,而不必在每个元组中都存放。上例中,“信息系”只需存放2次。而在非聚簇情形下,需存放500次。

值得一提的是,一旦聚簇被建立并被装入数据之后,则其存在对于用户来讲都是透明的,用户可以像引用非聚簇数据一样来引用聚簇数据。

2. 聚簇的适用范围

聚簇设计,即需要确定建立多少个聚簇,每个聚簇中包含多少个表及聚簇码。一个数据库中可能建立多个聚簇,一个表只能加入一个聚簇。当满足下列条件时,一般可考虑建立聚簇。

(1) 聚簇功能不但适用于单个关系,也适用于经常进行连接操作的多个关系。

设student和dept分别为“学生”表和“系”表,两个表通过dno(dept的主码和student的外码)来连接。若将dno取值相同的student元组和dept元组聚簇存放,就相当于把两个表按“预连接”的形式存放,从而大大提高了连接操作的效率。

(2) 通过聚簇码进行访问或连接是该表的主要应用,与聚簇码无关的其他访问很少,或是次要的。尤其是SQL语句中包含与聚簇码有关的ORDER BY、GROUP BY、UNION、DISTINCT等语法成分时,聚簇格外有利,可以省去对结果的排序。

(3) 对应每个聚簇码的平均元组数既不能太少,也不能太多。太少则聚簇的效益不明显,甚至浪费块的空间;太多就要采用多个链接块,同样对提高性能不利。

(4) 聚簇码的值应相对稳定,以减少修改聚簇码所引起的维护开销。

3. 优化聚簇设计

(1) 从聚簇中删除经常进行全表扫描的关系;

(2) 从聚簇中删除更新操作远多于连接操作的关系;

(3) 不同的聚簇中可能包含相同的关系,一个关系可以在某个聚簇中,但不能同时加入多个聚簇。从多个聚簇方案(包括不建立聚簇)中选择一个较优的,即在这个聚簇上运行各种事务的总代价最小。

聚簇只能提高某些应用的性能,而且建立与维护的开销是相当大的。各主流数据库管理系统支持聚簇的方法不尽相同。数据库设计者应在充分了解数据库管理系统功能的前提下,根据应用的特点来合理运用聚簇。