oracle hash集群,用hash cluster表提高查询性能 (一)

cluster可以把一个或者多个表的数据按照键值聚合在一起,在很多应用场景能提高查询性能。

cluster可以为B*Tree cluster也可以是hash cluster,这篇文章主要讨论hash cluster。[@more@]一、hash cluster重要参数

与传统的表不同,cluster在创建的时候就要定好大小,预先分配空间,这个步骤至关重要。如果空间分配过大,则会导致空间浪费,如果过小,会导致块溢出(同一个hash key分布在不同的block中),从而导致IO增大。

那么,如何合理设定空间呢?这就需要合理设定hashkeys和size两个参数了。

hashkeys: cluster预期的唯一键值的数量(count(distinct hash_key))

size: 平均每个唯一键值的大小。假设一个键值对应10行,每行大小为100字节,则size = 10*100=1000

hash cluster在初始化分配空间的时候,分配空间的大小的计算公式是:hashkeys * trunc(block_size/size)

下面通过一个实例来说明如何计算hashkeys和size的大小:

1) 得到行数、平均行长、数据块数量

SQL> select num_rows,AVG_ROW_LEN,blocks from dba_tables where table_name='USERS';

NUM_ROWS AVG_ROW_LEN BLOCKS

---------- ----------- ----------

1305646540 42 4347642

2) 得到有多少个不同的名字个数,这个相当于hashkeys

SQL> select count(distinct name) cnt from USERS;

CNT

-----------------------

100872483

3) 计算cluster的size参数

--计算方法是:size=(平均行长)*(每一个hash key平均对应的个数)

--在这里有13亿数据,有1亿不同的值,所以每一个key对应的记录为1305646540/100872483=13

-

SQL> select 42*(1305646540/100872483) "SIZE" from dual;

SIZE

-------------------------

543.628481

--计算时用的平均行长应稍大于实际平均行长

--如果hash key值在表中是唯一的,则size就简单了,稍大于平均行长即可

4) 语句以上的信息,最后cluster可以这样设置:

--实际的size参数应该稍大于计算出来的值

--如果确定以后数据不再改变,则可设置成与计算值一样大小

SQL> create cluster hash_cluster (hash_key number(38))

2 pctfree 0

3 hashkeys 100972483

4 size 600

5 single table

6 hash is hash_key;--用散列键作为散列函数

以上方法是基于现有数据进行的,如果没有数据,可以通过模拟数据或者估算,然后用同样的方式推算得出。

对于普通的hash cluster,因为涉及到几个表,在计算hashkeys和size时要把几个表都考虑进去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值