Oracle如何快速查找第N条记录?

时间:2021-08-31 23:25:11
Oracle如何快速查找第N条记录?
比如,要查找第10000条记录,或是第100000条,怎么实现? 主键id可能不确定的条件下.

12 个解决方案

#1


就是分页

#2


select * from (select rownum hh,* from tableName) where hh=10000

#3


引用楼主 chenchendf 的帖子:
Oracle如何快速查找第N条记录? 
比如,要查找第10000条记录,或是第100000条,怎么实现? 主键id可能不确定的条件下.


rownum=10000或者rownum=100000可以吗?

#4


没法快速!!
除非你建物化视图

#5


引用 4 楼 zxbyhcsdn 的回复:
没法快速!! 
除非你建物化视图

没法快速?
晕,上次面试时被问到了,俺就是说rownum,然后他就说,如果要查第10万行或是更后面呢?岂不是很慢?
我当时就迷糊了!

#6


有法。就是用rownum,关键看你怎么用。
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。

#7


引用 6 楼 vc555 的回复:
有法。就是用rownum,关键看你怎么用。 
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。

那具体怎么分页呢? 感觉用rownum实现分页也不能在忧能上有什么优化啊.

#8


select object_name,object_type,owner from ( 
    select object_name,object_type,owner, rownum rn  from dba_objects where rownum < 10001 

where rn >= 10000 ; 

#9


Oracle 快速查找记录 rownum

#10


引用 7 楼 chenchendf 的回复:
那具体怎么分页呢? 感觉用rownum实现分页也不能在忧能上有什么优化啊.

不是说了吗?先分页,再回表。
现在假设只查询第10W条记录,如果按楼上几位写的SQL,那么就不得不查询全部10W条记录,然后只返回一个值,即第10w行。这样效率当然低。
而先分页,则是在索引上结合rownum和stopkey分页,快速定位第10w条记录,然后用rowid关联该行其他列,进行回表查询,这时就只查一条记录,然后返回这条记录。逻辑读将极大降低。

具体SQL,我以前在论坛上回复过,你搜搜看。或者google下,这不是什么新问题了。

#11


引用 10 楼 vc555 的回复:
引用 7 楼 chenchendf 的回复:
那具体怎么分页呢? 感觉用rownum实现分页也不能在忧能上有什么优化啊. 
 
不是说了吗?先分页,再回表。 
现在假设只查询第10W条记录,如果按楼上几位写的SQL,那么就不得不查询全部10W条记录,然后只返回一个值,即第10w行。这样效率当然低。 
而先分页,则是在索引上结合rownum和stopkey分页,快速定位第10w条记录,然后用rowid关联该行其他列,进行回表查询,这时就只查一条记录,然后返回…


谢谢~

#12


二楼正解啊

#1


就是分页

#2


select * from (select rownum hh,* from tableName) where hh=10000

#3


引用楼主 chenchendf 的帖子:
Oracle如何快速查找第N条记录? 
比如,要查找第10000条记录,或是第100000条,怎么实现? 主键id可能不确定的条件下.


rownum=10000或者rownum=100000可以吗?

#4


没法快速!!
除非你建物化视图

#5


引用 4 楼 zxbyhcsdn 的回复:
没法快速!! 
除非你建物化视图

没法快速?
晕,上次面试时被问到了,俺就是说rownum,然后他就说,如果要查第10万行或是更后面呢?岂不是很慢?
我当时就迷糊了!

#6


有法。就是用rownum,关键看你怎么用。
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。

#7


引用 6 楼 vc555 的回复:
有法。就是用rownum,关键看你怎么用。 
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。

那具体怎么分页呢? 感觉用rownum实现分页也不能在忧能上有什么优化啊.

#8


select object_name,object_type,owner from ( 
    select object_name,object_type,owner, rownum rn  from dba_objects where rownum < 10001 

where rn >= 10000 ; 

#9


Oracle 快速查找记录 rownum

#10


引用 7 楼 chenchendf 的回复:
那具体怎么分页呢? 感觉用rownum实现分页也不能在忧能上有什么优化啊.

不是说了吗?先分页,再回表。
现在假设只查询第10W条记录,如果按楼上几位写的SQL,那么就不得不查询全部10W条记录,然后只返回一个值,即第10w行。这样效率当然低。
而先分页,则是在索引上结合rownum和stopkey分页,快速定位第10w条记录,然后用rowid关联该行其他列,进行回表查询,这时就只查一条记录,然后返回这条记录。逻辑读将极大降低。

具体SQL,我以前在论坛上回复过,你搜搜看。或者google下,这不是什么新问题了。

#11


引用 10 楼 vc555 的回复:
引用 7 楼 chenchendf 的回复:
那具体怎么分页呢? 感觉用rownum实现分页也不能在忧能上有什么优化啊. 
 
不是说了吗?先分页,再回表。 
现在假设只查询第10W条记录,如果按楼上几位写的SQL,那么就不得不查询全部10W条记录,然后只返回一个值,即第10w行。这样效率当然低。 
而先分页,则是在索引上结合rownum和stopkey分页,快速定位第10w条记录,然后用rowid关联该行其他列,进行回表查询,这时就只查一条记录,然后返回…


谢谢~

#12


二楼正解啊