数据库Oracle11g
--------------
name字段已建索引
原sql:(由于使用了like,并且内容前有百分号,默认是不使用索引的)
select id from user where name like '%admin%';修改后sql:(强制使用索引,实际结果确实使用了该索引)
select /*+INDEX_ASC (user NAME_INDEX)*/id from user where name like '%admin%';--------------
问题1:像这样强制使用索引进行like检索时是否真的缩小了检索范围而达到使用索引应有的效果?如果没有,如何修改?
--------------
问题2:排序+分页查询当前常用的方式为三层嵌套sql,内层排序、查出所有记录,中间层过滤超过最大值的部分,最外层过滤小于最小值的部分,但此法无可避免的使用了全表查询,这该如何避免?希望能提示下思路,直接给出示例sql更好。
--------------
谢谢大家!
 

解决方案 »

  1.   

    我在一个20000000条记录的table中试了,强制使用索引进行like检索,速度更慢,花费的资源更多。关注!
      

  2.   

    如果admin前不加%是可以用上索引的
      

  3.   

    强制使用索引不会不会造成其他的负面影响啊。我觉得大批量查询的话还是在.net/java代码里面做优化比较好。
      

  4.   

    楼上的解释sql语句怎么在.net和java代码里优化?如果在pl/sql 里优化效果不好的话,在.net中优化能好使吗?
      

  5.   

    .net/java代码里面做优化,难道是想把数据都查询出来了在处理?
      

  6.   

    1.这个没必要再多想,SQL语句在执行前已经会自动进行优化。LIKE查询是最常用的,怎么可能不对其进行最优化呢。你再多加什么都是画蛇添足,效果只能越差。2.这个,为什么不可以直接在最里层查询条件时直接用rownum来避免全表查询呢,你用的不是ORACLE吗,当rownum大于你设的条件,就不会继续搜索下去了。
      

  7.   

    to9L:
    如果在最内层使用rownum < x,再加上排序,出来的rownum就是乱序,外层再一截取,就不对了,会造成查出重复数据的情况。
    我用的是oracle呀。
      

  8.   

    select id from user where name like '%admin%';
    like条件中以%起首即使走索引,也是全索引扫描再加table scan by rowid,如果索引只是在name上的而且符合条件的记录超过全表记录的20%,那效果通常还不如直接走全表扫描。如果只是要优化这一句查询,那是很简单的,删除name上的索引,建一个包含name和id的索引,那该查询就完全走索引(虽然是全索引扫描)而不会去读表,效率应该高很多。
      

  9.   

    查询走了索引未必会增加查询速度,基于成本的优化器(CBO)大多数时候会自动选择优化的查询方式。
      

  10.   

    你可以试试在上面加个函数索引instr