如何在较长的文本字段上建立有效的索引?

    索引的键值太大的话会影响索引的效率, 还有可能出错. 但有时我们一定要为这字段建索引的话怎么办呢? 我们可以通过计算一个哈希值来实现. 比如有一个字段为NAME, 最长可能有1024个字符, 要在这个列上建一个索引的话, 可以有两种比较好的方法:

  1. 增加一个字段, 如HASH_NAME, 用于保存HASH值.
  2. 建一个函数索引.

    第一种方法需要有一个建在Insert或Update上的触发器来更新HASH_NAME字段, 第二种方法相对简单, 在Oracle的高版本中, 可以用第二种方法. 需要注意的是, 理论上Oracle的这个计算哈希值的算法并不能保证唯一, 因此在查询时需要注意, 需要写两个条件, 如下所示:

  1. HASH_NAME = DBMS_UTILITY.GET_HASH_VALUE(:P_NAME) AND NAME=:P_NAME
  2. DBMS_UTILITY.GET_HASH_VALUE(NAME) = DBMS_UTILITY.GET_HASH_VALUE(:P_NAME) AND NAME = :P_NAME

    另外在数据库升级中, 可能会升级这些系统包的定义, 因此函数索引可能会失效, 这是一个要注意的地方; 另外一个是哈希值的算法在不同的版本可能会变, 因此需要提前检查一下, 在升级后选择重新计算值或是重建一下函数索引.

    其他缺点是只能用等于来查找, 否则无法利用索引.

留言 (2)

DBMS_UTILITY.GET_HASH_VALUE,
这个函数 消耗CPU厉害吗, 可否大批量使用.

大量使用我也不知道啊, 不过应当尽量少用, Oracle不保证跨版本后算出来的值还是一样的.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Witch pleasure.
  • 很高兴.
  • I'm sorry. I'm engaged now.
  • 对不起, 我现在正忙着.
  • I'm glad to, but I'm afraid I don't have the time.
  • 我很乐意, 但我恐怕没时间.
  • Would you mind closing the window for me?
  • 能帮我关一下窗户吗? (你介意关下窗户吗? )
  • Not at all.
  • 当然可以. (当然不介意)