比如,要查找第10000条记录,或是第100000条,怎么实现? 主键id可能不确定的条件下.
12 个解决方案
#1
就是分页
#2
select * from (select rownum hh,* from tableName) where hh=10000
#3
rownum=10000或者rownum=100000可以吗?
#4
没法快速!!
除非你建物化视图
除非你建物化视图
#5
没法快速?
晕,上次面试时被问到了,俺就是说rownum,然后他就说,如果要查第10万行或是更后面呢?岂不是很慢?
我当时就迷糊了!
#6
有法。就是用rownum,关键看你怎么用。
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。
#7
那具体怎么分页呢? 感觉用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 ;
select object_name,object_type,owner, rownum rn from dba_objects where rownum < 10001
)
where rn >= 10000 ;
#9
Oracle 快速查找记录 rownum
#10
不是说了吗?先分页,再回表。
现在假设只查询第10W条记录,如果按楼上几位写的SQL,那么就不得不查询全部10W条记录,然后只返回一个值,即第10w行。这样效率当然低。
而先分页,则是在索引上结合rownum和stopkey分页,快速定位第10w条记录,然后用rowid关联该行其他列,进行回表查询,这时就只查一条记录,然后返回这条记录。逻辑读将极大降低。
具体SQL,我以前在论坛上回复过,你搜搜看。或者google下,这不是什么新问题了。
#11
谢谢~
#12
二楼正解啊
#1
就是分页
#2
select * from (select rownum hh,* from tableName) where hh=10000
#3
rownum=10000或者rownum=100000可以吗?
#4
没法快速!!
除非你建物化视图
除非你建物化视图
#5
没法快速?
晕,上次面试时被问到了,俺就是说rownum,然后他就说,如果要查第10万行或是更后面呢?岂不是很慢?
我当时就迷糊了!
#6
有法。就是用rownum,关键看你怎么用。
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。
是先分页再回表,还是先回表再分页,这样查第100万条数据也不会太慢。
#7
那具体怎么分页呢? 感觉用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 ;
select object_name,object_type,owner, rownum rn from dba_objects where rownum < 10001
)
where rn >= 10000 ;
#9
Oracle 快速查找记录 rownum
#10
不是说了吗?先分页,再回表。
现在假设只查询第10W条记录,如果按楼上几位写的SQL,那么就不得不查询全部10W条记录,然后只返回一个值,即第10w行。这样效率当然低。
而先分页,则是在索引上结合rownum和stopkey分页,快速定位第10w条记录,然后用rowid关联该行其他列,进行回表查询,这时就只查一条记录,然后返回这条记录。逻辑读将极大降低。
具体SQL,我以前在论坛上回复过,你搜搜看。或者google下,这不是什么新问题了。
#11
谢谢~
#12
二楼正解啊