聚簇索引和非聚簇索引

今天在搞概念的时候,突然相当以前对于这两者的理解比较模糊,就一并查了一下。

感觉查到的资料中有两篇写得比较好,就转载了

原文地址1:

http://blog.sina.com.cn/s/blog_607b68cc0100f5jo.html

内容如下:

--聚簇索引:
    -- 在Oracle当中,聚簇不是索引的组织形式,而是表的组织形式。
    --多用于表之间的连接字段。  
  --1.先创建一个聚族
CREATE CLUSTER emp_dept_cluster(deptno number(6))SIZE 1024; 
  --2.在聚簇索引上建立索引
 CREATE INDEX emp_dept_cluster_index ON CLUSTER emp_dept_cluster; 
 --3.创建表
        CREATE TABLE dept1(
               deptno NUMBER(6) PRIMARY KEY,
               dname VARCHAR2(50)
               )CLUSTER emp_dept_cluster(deptno);
        CREATE TABLE emp1(
               empno NUMBER PRIMARY KEY,
               ename VARCHAR2(50),
               sal NUMBER(5,2),
               deptno NUMBER(6),
               FOREIGN KEY(deptno) REFERENCES dept1(deptno)
        )CLUSTER emp_dept_cluster(deptno);
  --这样可以让两个表同时用上聚簇索引。一个表只能有一个聚簇索引,但是
        --一个聚簇索引可以包含多个列,称为组合索引
  --保证两个表的记录按照deptno值尽量存放到同一个物理块当中。
 --ORACLE中的聚簇表是指两个表有一个字段完全相同,并且在业务中经常会按这个字段为目标连接这两个表,这时建立聚簇表,
  --两个表公用一个字段,能减少占用空间,并能明显提高连接查询速度。

 

原文地址2:

http://space.itpub.net/9778796/viewspace-660186

内容如下:

1.聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。一个表最多只能有一个聚簇索引。 但是建立聚簇索引的空间耗费比较大 对以后的增加删除的影响比较大,所以要在有必要的情况下用 

2. 使用 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 (Col1 VARCHAR2(100)); 

  这样就建立了一个没有任何内容的簇(象给表分配了一块空间一样)。COL1的使用对于簇键是不相干的,不会再使用它。但是,它的定义应该与要增加的表的主键相符。接下来,建立包含在该簇中的表:

create table BOOKSHELF
  (Title VARCHAR2(100) primary key,
  Publisher VARCHAR2(20),
  CategoryName VARCHAR2(20),
  Rating VARCHAR2(2),
  constraint CATFK foreign key (CategoryName) references CATEGORY(CategoryName)
  )
  cluster BOOKandAUTHOR(Title); 

  在向BOOKSHELF表中插入数据行之前,必须建立一个聚簇索引:

create index BOOKandAUTHORndx on cluster BOOKandAUTHOR; 

  在上面的create table语句中,簇BOOKandAUTHOR(Title)子句放在表的列清单的闭括号的后面。BOOKandAUTHOR是前面建立的聚簇的名字。Title是将存储到聚簇Col1中的该表的列。create cluster语句中可能会有多个簇键,并且在created table语句中可能有多个列存储在这些键中。请注意,没有任何语句明确说明Title列进入到Col1中。这种匹配仅仅是通过位置做到的,即Col1和Title都是在它们各自的簇语句中提到的第一个对象。多个列和簇键是第一个与第一个匹配,第二个与第二个匹配,第三个与第三个匹配,等等。现在,添加第二个表到聚簇中:

create table BOOKSHELF_AUTHOR
  (Title VARCHAR2(100),
  AuthorName VARCHAR2(50),
  constraint TitleFK Foreign key (Title) references BOOKSHELF(Title),
  constraint AuthorNameFK Foreign key (AuthorName) references AUTHOR(AuthorName)
  )
  cluster BOOKandAUTHOR (Title); 

  当这两个表被聚在一起时,每个唯一的Title在簇中实际只存储一次。对于每个Title,都从这两个表中附加列。

  来自这两个表的数据实际上存放在一个位置上,就好像簇是一个包含两个表中的所有数据的大表一样。

  3. 散列聚簇
  对于散列聚簇,它只有一个表。它通过散列算法求出存储行的物理存储位置,从而快速检索数据。创建散列聚簇时要指定码列的数据类型,数据行的大小及不同码值的个数。如果码值不是平均分布的,就可能有许多行存储到溢出块上,从而会降低查询该表的SQL语句的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值