比如下面两个sql:
1)select a, b where contains(b,'你好')>0;
2)select a, b where contains(b,'%你好%')>0;
其中b字段是clob类型而且建了索引我是数据库新手。现在担心两个问题
1)第2个sql会引起table scan么?
2)效率会比第1个下降多少(假设返回的数据数量没有太大差异)

解决方案 »

  1.   

    你在索引上用函数,oracle就不会走索引(全部扫描),除非你在该字段上建函数索引。
    select a, b where b like '%你好%' ;
      

  2.   

       对于第二句SQL
       如果使用半模糊匹配: '你好%' ,   还有会走索引,性能差不多;
       但是你如果使用完全匹配:'%你好%'  就完全不匹配了,性能就下降了很多。   这种情况也是Orale不尽完美的地方。
       具体得看你要求是哪种。
       像我们通常的动态SQL中或其他地方,就是用了完全匹配,得牺牲性能才成就效果。
       
      

  3.   

    也可以看下执行计划再说,如果cost相差不大的话,建议使用完全匹配
      

  4.   

    没有深入研究过全文检索。
    第二个sql的%是什么含义,contains还用%通配符吗?
      

  5.   

    contains还需要%?contains本身就相当于like,即只要该字段包含,用等于就直接等于了,用不着再contains!
      

  6.   

    1)CONTAINS只能用于索引, 所以我猜测即使搜索'%你好%'这样的字串,还是用索引的。
    2)手头没有大数据量的库供测试,所以现在无法试验。
    3)%在常见数据库中都可以做通配符。我担心的是 1)会不会运行时重建索引? 
              2)在索引上查询 '%你好%' 会比查询 '你好' 效率低多少?请指教
      

  7.   


    %%只走函数索引,第2个sql的话,除非你b字段建立了函数索引,否则是表扫描!
      

  8.   


    Oracle的CONTAINS很变态,它只会全字匹配,要想查字串只能自己加%
      

  9.   

    有这事?是不是你设置问题?
    全文检索
    http://epub.itpub.net/4/1.htm
      

  10.   

    刚了解了一下,contains如果不加统配符,则只会匹配单词,加了通配符,才会模糊匹配,
    加%%统配符,性能肯定会有所下降,但可以通过创建substring索引来提高性能,oracle文档原文解释如下:When your wildcard queries are left- and double-truncated, you can improve query performance by creating a substring index. Substring indexes improve query performance for all types of left-truncated wildcard searches such as %ed, _ing, or %benz%.
    关于substring索引介绍,可参考
    http://download-west.oracle.com/docs/cd/B10501_01/text.920/a96518/cdatadic.htm#34699楼主可以尝试一下
      

  11.   

    substring索引看起来能解决问题,但是需要额外配置+耗费其他资源。