最近几个人都写Blog来关注Single Table Cluster, 我也来重复一下, 要说明的是可以在Hash表上加普通的索引, 以支持按范围的访问, 演示的角本如下:
CREATE CLUSTER HASH_C_DEMO (OBJECT_ID NUMBER)
SIZE 50 SINGLE TABLE HASHKEYS 1000;
CREATE TABLE T_C_DEMO (OBJECT_ID NUMBER, OBJECT_NAME VARCHAR2(30))
CLUSTER HASH_C_DEMO (OBJECT_ID);
CREATE INDEX IDX_T_C_DEMO ON T_C_DEMO (OBJECT_ID);
INSERT INTO T_C_DEMO SELECT OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS;
接下来测试一下等于查询的情况:
SQL> SELECT OBJECT_NAME FROM T_C_DEMO WHERE OBJECT_ID=621150;
OBJECT_NAME
------------------------------
P_DEMO
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (HASH) OF 'T_C_DEMO'
接下来测试一下范围查询的情况:
SQL> SELECT OBJECT_NAME FROM T_C_DEMO WHERE OBJECT_ID BETWEEN 611851 AND 611853;
OBJECT_NAME
------------------------------
SYS_LOB0000609516C00004$$
T_IOT
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T_C_DEMO'
2 1 INDEX (RANGE SCAN) OF 'IDX_T_C_DEMO' (NON-UNIQUE)
留言 (4)
这样创建的索引cluster factor将会很差,在实际环境中对于大部分的RANGE SCAN可能意义都不大
Posted by blue_prince | Mar 30, 2007 4:58 PM
先统计表中各种查询方式的比例, 不存在一种万表表.
现实中就有一些特别忙的表, 其中95%以上是按等于来查询的.
Posted by anysql | Apr 1, 2007 12:26 PM
INDEX (RANGE SCAN) 的 Logical Reads 是多少呀?
请来个比较,比如和Heap table上的Index.
Posted by 木匠 | Apr 3, 2007 6:36 AM
选择建hash表是为等于查询服务的, 在上面再建B*Tree索引是为了给少量的按范围查询服务的, 在这儿研究这个索引的效率没有意义, 如果按范围查询太多了, 就肯定不会选择建Hash表了.
Posted by anysql | Apr 3, 2007 8:10 AM