在前面的例子中, 我们都只是做了一些小批量数据, 如果我的Hash Cluster表有几个GB或几十个GB的大小时, 又怎么样呢? 下面进行的是我在笔记本上的测试, 用于测试的表的大小是100MB, 进行测试时的数据是50万条. 测试的目的是为了要证明Hash Cluster是否可能用于大数据量的表中, 即验证Oracle内建的Hash函数是否是高效的. 创建Hash Cluster的句语是:
CREATE CLUSTER C_T_OBJECTS (OBJECT_ID NUMBER(38,0))
SIZE 8192 SINGLE TABLE HASHKEYS 12800;
在100MB的DB_CACHE_SIZE下进行测试:
21:48:10 SQL> SELECT HASH_VALUE, BUFFER_GETS, EXECUTIONS
21:48:54 2 FROM V$SQL WHERE HASH_VALUE=3523526785;
HASH_VALUE BUFFER_GETS EXECUTIONS
---------- ----------- ----------
3523526785 540786 540696
在50MB的DB_CACHE_SIZE下进行测试, 可以看出DB_CACHE_SIZE的大小不是很关键:
21:51:37 SQL> SELECT HASH_VALUE, BUFFER_GETS, EXECUTIONS
21:51:44 2 FROM V$SQL WHERE HASH_VALUE=3523526785;
HASH_VALUE BUFFER_GETS EXECUTIONS
---------- ----------- ----------
3523526785 540790 540696
当另外一个会话在进行数据装载时, Cost将会增加, 这是因为Consistent Gets引起的, 从平均值来说仍是十分高效的.
22:03:19 SQL> SELECT HASH_VALUE, BUFFER_GETS, EXECUTIONS
22:03:35 2 FROM V$SQL WHERE HASH_VALUE=3523526785;
HASH_VALUE BUFFER_GETS EXECUTIONS
---------- ----------- ----------
3523526785 740454 540696
明天将在比较好的机器上, 测试10G大小左右的真实数据. 另外一个问题是如何去验证是否存在比较严重的数据分布(算出来的Hash值)不均匀的问题?
留言 (3)
在我们的 Production环境, 10.1.0.4 RAC,
一张表, 7百万行, 主键Hash, 平均列长 12 bytes,
一共两个列.
每小时访问30万次.
跑了2年了, 平均速度比我来之前提高了50倍,而且CPU使用率剧烈下降, 清爽.
Posted by 木匠 | Apr 28, 2007 1:29 AM
两个字段, 是正式表? 不是你自已做的一个Hash Index?
我现在已经找到如何定义SIZE和HASHKEYS的方法了.
Posted by anysql | Apr 28, 2007 10:31 AM
是运营系统里面的表, 分别是 book_id , book_qty, 以后可能会加上book_price.
是库存系统和订单系统的接口, 每次卖出一本书,quantity减一.
这样的设计可以避免blocking
(order update blocking inventory batch data loading).
以后在我的博客里面介绍.
讲讲你的 如何定义SIZE和HASHKEYS 的 原理,
等你下文书分解.
Posted by 木匠 | Apr 28, 2007 1:27 PM