问题描述
我想查一个大表的数据,大概有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秒为什么差别如此之大?求原因! 问题补充:kidding87 写道
解决方案
over()根据上一次的结果来累加比如row_number(col)over(order by col)这句话就是按照排序结果从起始到当前行对col的行号一个累加而oracle本身会把查询出来的结果view里面就已经包含了rownum这个列所以先排序在拿结果集中的rownum是没有问题的你直接把要排序tab换为(select * from xxxx order xxxxx)就可以了
解决方案二:
row_number() OVER (ORDER BY t.id DESC)这句话有个累加的过程,在这里浪费了很多时间而oracle本身就是由rownum属性的我再推荐一种分页吧,这个效率更高些select * from (select *,rownum as rn from tab where rownum<COUNT_END)a where a.rn>=COUNT_START