什么是聚簇
聚簇是根据码值找到数据的物理存储位置从而达到快速检索数据的目的聚簇索引的顺序就是数据的物理存储顺序叶节点就是数据节点非聚簇索引的顺序与数据物理排列顺序无关叶节点仍然是索引节点只不过有一个指针指向对应的数据块一个表最多只能有一个聚簇索引
使用 Oracle 聚簇索引
聚簇是一种存储表的方法这些表密切相关并经常一起连接进磁盘的同一区域例如表 BOOKSHELF 和BOOKSHELF_AUTHOR 数据行可以一起插入到称为簇(Cluster)的单个区域中而不是将两个表放在磁盘上的不同扇区上簇键(Cluster Key)可以是一列或多列通过这些列可以将这些表在查询中连接起来(例如BOOKSHELF表和BOOKSHELF_AUTHOR表中的 Title列)为了将表聚集在一起必须拥有这些将要聚集在一起的表
下面是create cluster命令的基本格式
create cluster (column datatype [ column datatype]) [other options];
cluster的名字遵循表命名约定column datatype是将作为簇键使用的名字和数据类型column的名字可以与将要放进该簇中的表的一个列名相同或者为其他有效名字下面是一个例子
create cluster BOOKandAUTHOR (Col VARCHAR());
这样就建立了一个没有任何内容的簇(象给表分配了一块空间一样)COL的使用对于簇键是不相干的不会再使用它但是它的定义应该与要增加的表的主键相符接下来建立包含在该簇中的表
create table BOOKSHELF (Title VARCHAR() primary key Publisher VARCHAR() CategoryName VARCHAR() Rating VARCHAR() constraint CATFK foreign key (CategoryName) references CATEGORY(CategoryName) ) cluster BOOKandAUTHOR(Title);
在向BOOKSHELF表中插入数据行之前必须建立一个聚簇索引
create index BOOKandAUTHORndx on cluster BOOKandAUTHOR;
在上面的create table语句中簇BOOKandAUTHOR(Title)子句放在表的列清单的闭括号的后面BOOKandAUTHOR是前面建立的聚簇的名字Title是将存储到聚簇Col中的该表的列create cluster语句中可能会有多个簇键并且在created table语句中可能有多个列存储在这些键中请注意没有任何语句明确说明Title列进入到Col中这种匹配仅仅是通过位置做到的即Col和Title都是在它们各自的簇语句中提到的第一个对象多个列和簇键是第一个与第一个匹配第二个与第二个匹配第三个与第三个匹配等等现在添加第二个表到聚簇中
create table BOOKSHELF_AUTHOR (Title VARCHAR() AuthorName VARCHAR() constraint TitleFK Foreign key (Title) references BOOKSHELF(Title) constraint AuthorNameFK Foreign key (AuthorName) references AUTHOR(AuthorName) ) cluster BOOKandAUTHOR (Title);
当这两个表被聚在一起时每个唯一的Title在簇中实际只存储一次对于每个Title都从这两个表中附加列
来自这两个表的数据实际上存放在一个位置上就好像簇是一个包含两个表中的所有数据的大表一样
散列聚簇
对于散列聚簇它只有一个表它通过散列算法求出存储行的物理存储位置从而快速检索数据创建散列聚簇时要指定码列的数据类型数据行的大小及不同码值的个数如果码值不是平均分布的就可能有许多行存储到溢出块上从而会降低查询该表的SQL语句的性能
散列聚簇被用在总是通过主键查询数据的情况例如要从表 T 查询数据并且查询语句总是是这样
select * from T where id = :x;
这时散列聚簇是一个好的选择因为不需要索引Oracle 将通过散列算法得到值 :x 所对应的物理地址从而直接取到数据不用进行索引扫描只通过散列值进行一次表访问
散列聚簇语法示例
CREATE CLUSTER personnel ( department_number NUMBER ) SIZE HASHKEYS STORAGE (INITIAL K NEXT K); CREATE CLUSTER personnel ( home_area_code NUMBER home_prefix NUMBER ) HASHKEYS HASH IS MOD(home_area_code + home_prefix ); CREATE CLUSTER personnel (deptno NUMBER) SIZE SINGLE TABLE HASHKEYS ;