聚簇表

来源:互联网 发布:c语言联合体 编辑:程序博客网 时间:2024/05/23 19:51

第一部分

聚簇表,简单来说就是利用选取一个或多个列作为cluster key,具有相同cluster key的一个或多个表的数据行会被保留在同一个数据块中。

适用条件:对于经常需要进行连接操作而又不会经常被更新的几个表,可以考虑建立对这几个表建立聚簇表。

不太适合的条件:

1、经常被更新的表。跟堆表相比,聚簇表的插入操作的时候,在插入前需要查找cluster key以定位插入的位置;对于更新操作,若更新值为cluster key,则意味着对应更新数据行ROWID的修改。

2、经常需要进行full table scan的表

3、需要被truncate的表。进行该操作的时候,相当于DELETE聚簇表中的对应数据行。该操作的实施,跟用聚簇表来减少连接操作所带来的I/O消耗的初衷有违。

优点:减少经常性连接操作所带来的disk I/O,加快语句执行时间。同时由于cluster key不需要重复存储,在一定程度上降低了存储空间。

第二部分:Indexed cluster和hash cluster

一、Indexed cluster

所谓indexed cluster是指在cluster key上建有索引的聚簇表。cluster index是建立在cluster key上的一个B-tree树。该索引必须在任何数据行被插入到聚簇表之前被创建。如下图:


二、hash cluster

所谓hash cluster是指使用hash函数来定位读取数据的一种聚簇表。

原理:设置一个hash函数,使得每一个聚簇键通过这个hash函数都映射到一个hash value,通过这个hash value可以找到对应的数据块。

注意:在创建cluster的时候设置hash的相关情况,有以下三个比较密切相关的设置:

HASHKEYS:指定hash键值的个数,实际上通常是比指定值大的素数。如cluster key的基数为100,则实际的hash键值个数为101;

HASH IS expresson:指定hash函数,默认为DBMS所提供的HASH函数。选择HASH函数的时候,应该充分考虑到cluster key键值的分布。如果多个具有不同聚簇值的行指向同一个hash value,也就是出现hash collision,则很容易出现溢出的问题(当数据块满了之后,插入到一个新的数据块中),这会使得聚簇因子变坏。如下图:


size n:指定单位聚簇的大小,这个可以根据每个cluster key平均对应多少的数据行,以及每一个数据行的平均长度来大概确定。同时为了避免溢出的出现,会预留一定的空间,如一个数据块中有两个HASH键,则预留15%的空间,三个HASH键则预留12%,四个则预留8%的空间,大于四个则直接计算。如果SIZE的设定值的大小大于一个数据块的大小,则默认使用OS的数据块。一般默认大小为数据库的数据块。

三:single table cluster

single table cluster是指一个聚簇只是对应一个表。其在indexed cluster和hash cluster中都有,只要在定义聚簇的时候,加single table就行了。不同于普通的索引,其在大数据量的范围查找中具有很大的性能优势。


---------------------------------------------------------------------------------------------------


如有错误,欢迎指正


技术交流QQ:1732035211
技术交流邮箱:1732035211@qq.com
新浪微博:数据库小菜鸟http://weibo.com/u/3132578390