语句1:select * from table where key like '%search%'语句2:select * from table where key like 'search%'执行语句1的时候是全字段搜索,而执行语句2的时候是按照索引key来搜索哪位高手能告诉究竟是怎么回事?怎么才能解决????????????

解决方案 »

  1.   

    在Oracle中,当fld_name字段已被索引过,对like 'fld_value%'条件进行索引查询,
    而对like '%fld_value%'进行全表扫描。其实这样的查询方案完成可以想像出来,对
    like 'fld_value%'可以利用索引进行快速定位,而对like '%fld_value%'则只能通过
    全表扫描来确定符合条件的数据。所以我们可以在基于Oracle索引规则的基础上进一步
    理解这两种方式的查询计划为什么不同。
      

  2.   

    谢谢楼上的答案!!!那么通过什么方法才能解决呢?我做的是一个多表union的视图,uion的语句都是如语句1一样,查询的速度慢的要死希望楼上能给个具体解决的方法谢谢!!!
      

  3.   

    'XXXX%'至少oracle可以按照XXXX索引查询
    '%XXXX%'就只有全检索这一条路了
      

  4.   

    同意,而且查询的时候尽量少用 like '% %'格式的数据,因为数据多的时候速度很慢。
    加快速度的办法,我想除建立索引外,还可以考虑建立分区表、建立分区索引等。
    以上是个人之拙见
      

  5.   

    'XXXX%'至少oracle可以按照XXXX索引查询
    '%XXXX%'就只有全检索这一条路了
      

  6.   

    1.在全表搜索是一个最快的访问方法时,将小表的全表搜索放到缓存中,应该确保有一个专门的数据缓冲用作行缓冲。
    2.确保最优的 JOIN 操作:有些查询使用 NESTED LOOP join 快一些,有些则是 HASH join 快一些,另外一些则是 sort-merge join 更快。
      

  7.   

    先考虑一下为什么需要使用'%search%'
    为什么不能够使用'search%'
      

  8.   

    给你一个比较弱的实现方法,不过没有测试过,也会有一定的代价,哈哈!将你的那个字段保存两份,一份正向,令一份反向,这样两个一起 前向匹配就可以找到了,哈哈!比如:
    fielda, fieldb, fieldc  其中fieldb 是你要找的
    select * from tbl where fieldb like "%search%";现在添加一个字段 fieldd, fieldd = fieldb 的字符串反转一下。那么就可以用select * from tbl where fieldb like "search%"  and fieldd like 'hcraes%' ;
    这样来查找了。
    效率方面没有测试过,不过如果你有兴趣,可以测试下。 哈哈!
    如果那个人测试过了,不妨将结果公布一下,让大家了解下是否可行。谢谢!