表A(100万多条记录)中含某一字段FIELD_1(NVARCHAR2 2000,已经建立索引),该字段存放如下格式的内容:";1001;4003;1002;1005;53123;”,要搜索其中某一内容:如“;1002;”.问题:目前我用的LIKE进行搜索,但速度极慢,可能要等上60秒才能查出,有无方案解决搜索速度问题?(目标2-3秒),是否必须得用LIKE进行搜索?有无不改变表结构,而提高速度的方案?

解决方案 »

  1.   

    if instr('1002',FIELD_1) > 0 then
      --sql代码
    end if;
      

  2.   

    你这个可以采用Oracle全文索引来提高性能。
      

  3.   

    这是全文搜索
    CREATE TABLE MY_ITEMS
    (
      ID           NUMBER(10)                       NOT NULL,
      NAME         VARCHAR2(200 BYTE)               NOT NULL,
      DESCRIPTION  VARCHAR2(4000 BYTE)              NOT NULL,
      PRICE        NUMBER(14,2)                     NOT NULL
    )
      
    CREATE INDEX MY_ITEMS_NAME_IDX ON MY_ITEMS
    (DESCRIPTION)
    INDEXTYPE IS CTXSYS.CTXCAT;
      

  4.   

    可以考虑建基于INSTR的函数索引...
      

  5.   

    如果";1001;4003;1002;1005;53123;"内的元素是有限的,可枚举的,建instr函数索引是相当便捷的办法
    不过看题意,应该不可能吧
      

  6.   

    基于自定义函数的Function-Based索引创建:
    http://oracle.chinaitlab.com/exploiture/531800.html另外:
        在创建和使用基于函数的索引之前,需要做一些最初的设置。为了创建这个索引,需要有一些特权。下面是为了使用基于函数的索引需要做的工作:
    为了在自己的模式中的表上创建基于函数的索引,必须有系统特权QUERY REWRITE。
    为了在其他模式中的表上创建基于函数的索引,必须有系统特权GLOBAL QUERY REWRITE。
    使用基于成本的优化器。基于函数的索引只对基于成本的优化器是可见的,基于规则的优化器永远不会使用。
    使用SUBSTR约束从用户写的函数中返回VARCHAR2或RAW类型的值。
    对于优化器使用基于函数的索引,必须设置如下的会话或系统变量:
        QUERY_REWRITE_ENABLED=TRUE
        QUERY_REWRITE_INTEGRITY=TRUSTED 
      

  7.   


    create index idx_1 on A(instr(FIELD_1,';1002;'));
      

  8.   

    用Oracle自带的函数:instr('1002',FIELD_1) > 0 速度会很快的,不妨一试~~
      

  9.   

    看来得用instr()取代like尝试下了
      

  10.   

    估计楼主是用的like %+条件+%,这样索引是没用的