index cluster/hash cluster/sort hash cluster

簇是一个或多个表的组合,这些表的数据存储在相同的数据块中,当通过簇键查询这些

表时,只需读一个数据块就能返回连接的多个表的数据; 


   

关于 hash cluster 和 sorted hash cluster,在 TOM 的那本<Expert Oracle Database 

Architecture: 9i and 10g Programming Techniques and Solutions>第 10 章有相当清楚

地讲解。在相同 hash 值对应的块里面,数据行是按指定的列排序存储的。 

索引聚簇表是表相关的表共享同一数据块中的相同列, 并把相关数据存储中同一个数据

块上。创建索引聚簇表中最重要的是对 SIZE 参数有很好的估量,否则聚簇将会降低空间利

用,降低效率。 


 使用索引聚簇表的注意点: 

1、如果表中数据有大量 DML 操作的话,那么聚簇将不适用,因为会消极地影响到 DML 性能。  

2、聚簇中,全表扫描将受到影响。这是因为将扫描聚簇中不同表的数据,额外增加很多无

用的数据。 

3、如果经常 TRUNCATE 表和装载表的话,聚簇将不适用。聚簇中的表无法被 TRUNCATE 的,

这是因为每个块中不只是存储一张表的数据。 

SQL> truncate table emp; 

ORA-03292: Table to be truncated is part of a cluster 

4,如果大部分是读取操作, 且通过聚簇码索引或聚簇表中其他索引来读取的话, 聚簇将会比

较比较适用。 

索引聚簇加载数据应该是同时装载同一聚簇码的所有数据,而不是一次装载聚簇中不同

表的数据。这是因为如果一次装载单张表数据的话,很有可能单个码值的数据大于 SIZE 指

定的数据,但是由于聚簇码已经分配完成,此时将会聚簇码块有许多链接块,影响性能。通

过一次装载每个码值对应的数据,可以更好地利用聚簇块的空间。 

   散列(哈希)聚簇表:概念上同索引聚簇表一样,不同的是用哈希函数代替了索引聚簇 

码来进行数据的分配。事实上在散列聚簇中数据就是索引,因为数据决定行的物理位置。散

列聚簇表中 ORACLE 根据行的码值,利用内部函数或提供的函数对聚簇码值进行运算,以决

定数据的物理存储位置。散列聚簇通常意味着如果通过聚码访问的话,一个 IO 就能够提取

到所需的数据。创建散列聚簇时,必须指定散列码值的数目。由于使用哈希函数来确定数据

的分布,对散列聚簇表不能使用范围扫描。全扫描散列聚簇表时,不论表是否为空,ORACLE

将全扫描所有块,这是因为散列聚簇中数据块都是预先分配的。散列聚簇的初始数据装 

载将会比较慢。自定义的散列函数限定只能使用表中可用的列和 ORACLE 内置函数。 

散列聚簇要点: 


1、  散列聚簇通过散列码查询的时候需要的 IO 很少。 几乎一个 IO 就可以提取到所需的数据,

除非发生了行溢出。而传统索 

引至少需要 2 个 IO 才能得到数据。 

2、散列聚簇查询 CPU 开销大。散列聚簇是 CPU 密集型的,而索引是 IO 密集型的。 

3、 对表中数据量比较有把握, 如行数, 每行占用空间, 有合理的上限, 正确设置好 HASHKYES

和 SIZE 参数,那么散列聚簇将比较适用。 

4、散列聚簇降低 DML 性能。 

5、总是经常通过 HASHKEY 等值访问数据。 


http://www.itpub.net/viewthread.php?tid=442689&highlight=Index%2BCluster(需试验) 

http://www.itpub.net/viewthread.php?tid=138815&highlight=index%2Bcluster 

猜你喜欢

转载自chenlin10058.iteye.com/blog/1558520