非聚集索引和聚集索引

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。建议使用聚集索引的场合为:  
    a.此列包含有限数目的不同值;  
    b.查询的结果返回一个区间的值;  
    c.查询的结果返回某值相同的大量结果集。  
    非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。建议使用非聚集索引的场合为:  
    a.此列包含了大量数目不同的值;  
    b.查询的结束返回的是少量的结果集;  
    c.order by   子句中使用了该列。  


   
--不用索引查询    
  SELECT   *   FROM   IndexTestTable   WITH(INDEX(0))    
  WHERE   Status='B'    
   
  --创建聚集索引    
  CREATE   CLUSTERED   INDEX   icIndexTestTable    
  ON   IndexTestTable(Status)    
  GO    
   
  --使用索引查询    
  SELECT   *   FROM   IndexTestTable   WITH(INDEX(icIndexTestTable))    
  WHERE   Status='B' 

下面的表总结了何时使用聚集索引或非聚集索引。


动作描述
 使用聚集索引
 使用非聚集索引
 
列经常被分组排序
 应
 应
 
返回某范围内的数据
 应
 不应
 
一个或极少不同值
 不应
 不应
 
小数目的不同值
 应
 不应
 
大数目的不同值
 不应
 应
 
频繁更新的列
 不应
 应
 
外键列
 应
 应
 
主键列
 应
 应
 
频繁修改索引列
 不应
 应
 
  事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/slxx0712/archive/2009/09/08/4528253.aspx

posted @ 2010-09-08 18:33  大斌  阅读(342)  评论(0编辑  收藏  举报