索引的键值太大的话会影响索引的效率, 还有可能出错. 但有时我们一定要为这字段建索引的话怎么办呢? 我们可以通过计算一个哈希值来实现. 比如有一个字段为NAME, 最长可能有1024个字符, 要在这个列上建一个索引的话, 可以有两种比较好的方法:
- 增加一个字段, 如HASH_NAME, 用于保存HASH值.
- 建一个函数索引.
第一种方法需要有一个建在Insert或Update上的触发器来更新HASH_NAME字段, 第二种方法相对简单, 在Oracle的高版本中, 可以用第二种方法. 需要注意的是, 理论上Oracle的这个计算哈希值的算法并不能保证唯一, 因此在查询时需要注意, 需要写两个条件, 如下所示:
- HASH_NAME = DBMS_UTILITY.GET_HASH_VALUE(:P_NAME) AND NAME=:P_NAME
- DBMS_UTILITY.GET_HASH_VALUE(NAME) = DBMS_UTILITY.GET_HASH_VALUE(:P_NAME) AND NAME = :P_NAME
另外在数据库升级中, 可能会升级这些系统包的定义, 因此函数索引可能会失效, 这是一个要注意的地方; 另外一个是哈希值的算法在不同的版本可能会变, 因此需要提前检查一下, 在升级后选择重新计算值或是重建一下函数索引.
其他缺点是只能用等于来查找, 否则无法利用索引.
留言 (2)
DBMS_UTILITY.GET_HASH_VALUE,
这个函数 消耗CPU厉害吗, 可否大批量使用.
Posted by 木匠 | Sep 29, 2007 2:55 AM
大量使用我也不知道啊, 不过应当尽量少用, Oracle不保证跨版本后算出来的值还是一样的.
Posted by anysql | Sep 29, 2007 10:31 AM