用like ,如果%在字符后面,有可能用索引,如果%在字符前面,则可以建立函数索引.
如果字符两侧都有%,你需要考虑用 InterMedia

解决方案 »

  1.   

    在where 后面的条件字段上建立合适的索引,会增加查询速度。
      

  2.   

    楼上的各位仁兄,我用的是两边都有%的查询,这样是不是更慢?jxc(GameHeart)这位仁兄能不能详细的说明一下InterMedia? rolandzhang()这位仁兄,你说的建索引可能也不起作用吧,like本身就是全表查询,建不建索引的效果不会太明显
      

  3.   

    建索引然后建议用union查找
      

  4.   

    create index idx_ctx_表名_字段列表 on 表名(字段列表)
    indextype is CTXSYS.CONTEXT
    ;select * from 表名 where contains(字段名,'查询内容') > 0;
      

  5.   

    如果你是前后都有%,那么是使用不到索引的。
    建议你使用 jxc(GameHeart)楼上的方法,建立Oracle Te xt索引(这是9i的叫法,8i叫interMedia)。这里有个比较:
    不使用Oracle Text的文本搜索可能会出现问题。例如,如果你不用Oracle Te xt索引,而要在NAME列搜索单词“rice”,你可能按如下所示使用操作符LIKE或函数INSTR(): 
    SELECT id, name
      FROM recipes
     WHERE UPPER(name) LIKE '%RICE%';
    SELECT id, name
      FROM recipes
     WHERE INSTR(UPPER(name), 'RICE') > 0;
    UPPER函数的使用,是在忽略大小写的情况下查找所有出现的“rice”所必须的,但会导致name列上的标准Oracle索引(BTREE)被忽略。而且,在name列使用标准索引要求你从被索引的列的开始就要匹配搜索术语。也就是说,要使用标准索引找到示例数据第三行中的“Rice”,查询的谓项必须如下所示: 
    WHERE name LIKE 'Spanish Rice%'
    它与搜索“rice”完全不同,然而它阐明了如何为了让Oracle选择一个BT REE 索引而将不得不限制你的搜索。使用上述方法中的一个查找一文本串可能是一冗长的任务。相反,Oracle Text搜索术语“rice”(默认忽略大小写)时由SELECT语句使用Oracle Tex t特殊的CONTAINS操作符来完成。 
    SELECT id, name
      FROM recipes
     WHERE CONTAINS (name, 'rice') > 0;
    CONTAINS的参数是正在被搜索的列名称,上面例子的Text Query Expression(文本查询表达式)包含了一个术语(“rice”)和一个可选用的第三方参数(在这篇文章联机版的分数查询例子中介绍了可选用参数)。CONTAINS返回一个显示分数的数字,它可以是0到 100之间的任何值。如果一篇文档一点也不能匹配搜索标准,它收到的分数为0,所以谓项WHE RE (name, 'rice') >0将查找与标准相匹配的文档,即使是以最微弱的方式相匹配。参见“ Keeping Score-the Salton Algorithm”,获得关于Oracle Text引擎使用的计分算法方面的更多信息。