Oracle中普通的表称为堆表(heap table),堆表中的数据是无序存放的,往往在使用一段时间后,数据就变得非常无序。如下图所示,索引中相同的key对应的数据存放在不同的block 中,这时,如果要通过索引查询某个key的数据,就需要访问很多不同的block,代价非常高。
Oracle中有一个统计信息clustering factor,它就是用来反映索引中键值在表中的有序程度,clustering factor的值如果接近表的blocks的数量,表明数据在表中的是有序的,而如果这个值接近表的行数,则表明表中的数据是无序存放的。因为 clustring factor对于索引查询的影响很大,所以在CBO计算cost时,这个值非常重要。
我们可以通过创建一个单表的hash cluster,将相同键值的数据物理存放在一起,达到提高性能的目的。创建cluster有两个最重要的参数:HASHKEYS和SIZE,前者表示 cluster中有多少个不同的键值,后者表示每个键值需要分配的空间。因为hash cluster的空间是预先分配的,这两个值的正确设置对cluster的性能影响非常大。hashkeys设置过大,会造成空间浪费,而如果设置过小,则会产生大量的hash碰撞,极大影响性能。size也是一样,设置过大会浪费空间,而设置过小,数据超过预先分配的空间时,会通过链接方式存放在溢出段中,影响性能。而这两个值一旦设置,就无法更改。
hash cluster简单的说就是通过预先分配空间的方式,将相同key的数据存放在一起,以提高查询性能的一种手段,所以准确的设置hashkeys和 size参数是使用hash cluster的关键,使用的前提是key的数量是可以估算的,而且每个key的数据是基本平均的。但是,在实际使用的环境中,数据量的变化往往是不可预知的,这也造成hash cluster的应用场景非常有限。
Index cluster和hash cluster类似,只不过index cluster是通过索引实现数据定位,而且index cluster的空间是动态分配的,但是同样存在正确设置size参数的问题,设置过大过小都会产生性能问题。
个人观点:Oracle cluster更适合相对静态数据的存储,对于OLTP应用来说,cluster在大部分情况下都不太适用,因为我们都无法预估到数据量的变化,根本无法合理设置cluster的参数。
任何技术都要找到合适的应用场景,有利一定有弊,有些技术确实是看上去很美,但是并不实用,而有些方案看上去很土,但是可以解决问题,找到最合适的就好。
-EOF-
如果哪位兄弟有oracle cluster解决实际问题方面的案例,也请和我一起交流。
原文转自:http://blogread.cn/it/article/2348