在前面的例子中, 我们都只是做了一些小批量数据, 如果我的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值)不均匀的问题?