日期:2014-05-16  浏览次数:20435 次

聚集索引和非聚集索引
聚集索引和非聚集索引
?
聚集索引:表的物理存储按照索引顺序排序。
非聚集索引:表的物理存储不按照索引顺序排序。
聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入)。但在范围查询数据比非聚集数据的速度快。
?
为什么聚集索引的范围查询会快呢?这里用ORACLE的聚簇因子来说明。
?
聚簇因子(CLUSTERING_FACTOR)
?
聚簇因子是ORACLE用来表示索引顺序和表顺序相似程度的。聚簇因子越小,相似度越高,聚簇因子越大,相似度越低。?
?
当clustering factor 很高时,说明index entry(rowid) 是随机指向一些block的,在一个大的index range scan时,这样为了读取这些rowid 指向的block,就需要一次有一次重复的去读这些block。当clustering factor 值低时,说明index keys(rowid) 是指向的记录是存储在相同的block里,这样去读row时,只需要在同一个block里读取就可以了。就可以减少重复读取block的次数。
?
很显然,聚集索引的clustering factor?是所有索引中最低的,所以聚集索引的范围查询比非聚集索引快一些。
?
索引组织表
?
Oracle中没有所谓的聚集索引,但有索引组织表(IOT)。Oracle的普通表即堆表,存储数据时没有顺序可言,而Oracle的索引组织表是根据主键顺序来存储表中的数据的。索引组织表的结构和索引一样,只是一般索引放的是索引列的键值,而索引组织表放的是整个表的数据。经常更新的表当然不适合IOT,因为oracle需要不断维护索引,而且由于字段多索引成本就大。如果不是经常使用主键访问表,就不要使用IOT。