现在在本地数据库中建了一个ip数据库,在id字段上建了索引,现在执行以下语句来分页查询(输入到pl/sql中),发现特慢
SELECT * FROM tbl_ip_address t1 WHERE 
(SELECT count(*) FROM tbl_ip_address t2 WHERE t2.id < t1.id ) > = 10
 AND (SELECT count(*) FROM tbl_ip_address t2 WHERE t2.id < t1.id ) < 20
 
 共51000条记录,id建了索引,花时597s
问题出在哪儿?如何调优?请高手指点

解决方案 »

  1.   

    为啥要用count啦,oracle不是有rownum嘛,这个应该比你写的count好用,
    一般情况下,分页都是用的这个.
      

  2.   

    rownum未必和id能够按相同的顺序增长,并且rownum不支持>
      

  3.   

    rownum不支持>
    这是因为它是伪列
    你可这样子生成一列rownum rn 这样就可以>了
    你这里面几个问题
    select * 这种尽量少用,特别是表中有许多字段,尽可能只取需要的字段
    后面的count(*) 这样一弄,你的索引没有用到,还是全表扫描,尽可能用count(索引字段)
    其实分页一般都是用rownum要比你这有效率
     我试着改一下,你再去试试效率
    select a.*
    from (
    SELECT t1.*,rownum rn FROM tbl_ip_address t1 order by t1.id
      )
    where rn >=10 and rn<=19
      

  4.   


    select a.* 
    from ( 
    SELECT t1.*,rownum rn FROM tbl_ip_address t1 order by t1.id 
      ) a
    where rn >=10 and rn <=19
      

  5.   

    如果你的ORACLE版本合适,你可以看看我的这篇文章:
    http://blog.sina.com.cn/s/blog_511846a201008sbu.html