iteye_20166
2012-05-23 10:06 阅读 325

求教分页效率问题

我想查一个大表的数据,大概有10M条数据,取其中的25条。测试发现两种方法时间差别很大,想求问大神原因。
第一种
SELECT * FROM (SELECT t.*,row_number() OVER (ORDER BY t.id DESC) AS rn FROM td_test t) WHERE rn BETWEEN 9999975 AND 10000000
大概用时5分钟。
第二种
SELECT * FROM (SELECT t.* FROM td_test t ORDER BY t.id DESC) WHERE rownum BETWEEN 9999975 AND 10000000
大概耗时1分30秒

为什么差别如此之大?求原因!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    ll89308839 ll89308839 2012-05-23 11:33

    over()根据上一次的结果来累加
    比如
    row_number(col)over(order by col)这句话就是按照排序结果
    从起始到当前行对col的行号一个累加

    而oracle本身会把查询出来的结果view里面就已经包含了rownum这个列
    所以先排序在拿结果集中的rownum是没有问题的
    你直接把要排序tab换为(select * from xxxx order xxxxx)就可以了

    点赞 评论 复制链接分享
  • ll89308839 ll89308839 2012-05-23 10:43

    row_number() OVER (ORDER BY t.id DESC)
    这句话有个累加的过程,在这里浪费了很多时间
    而oracle本身就是由rownum属性的

    我再推荐一种分页吧,这个效率更高些
    [code="sql"]select * from (select *,rownum as rn from tab where rownum=COUNT_START[/code]

    点赞 评论 复制链接分享

相关推荐