oracle分页查询优化?oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据?( 二 )


select * from (select rownum tid,components.* from components where rownum<=100) where tid<=10;



Q4:oracle 高效分页查询SQL
因为一个功能需要读取一个大表的所有数据做业务处理,那这样肯定不能一次性查出所有数据,需要程序分页查询处理,模拟测试一个200万数据量的表发现耗时很久,并不是业务处理耗时,而且分页查询耗时了 。oracle的分页查询可能大家都知道利用rownum,而且大部分公司这种分页都是底层封装好的了,所有平时大家使用的时候也没注意(这次之后特意留意了一下,我们公司就是用了错误的)
这两条查询语句看着区别不大,但是性能却差很多 。经过测试第一种性能最好,而且随着数量的增大,几乎不受影响 。第二种随着数据量的增大,查询速度也越来越慢 。表200W条数据的情况下,第一种查询耗时基本是0.3s,第二种基本在1.3s以上 。一个查询足足差了一秒 。别小看这1秒 。200W条数据每次查询1000条,查询完也差了2000s=33分钟.
分页的目的就是控制输出结果集大小,将结果尽快的返回 。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 20这句上 。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率 。
对于正确有order by语句,第二层的查询条件WHERE ROWNUM <= 20就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了
对于错误有order by 语句,由于查询条件where b.rowno >= 11 and b.rowno <= 20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道b.rowno代表什么) 。因此对于这个语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据 。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多 。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效 。
Q5:Oracle分页
例如select id,real_name from (select rownum rn,id,real_name fromaccountwhere rownum<? ) where rn>?
查询的时候不要select * ,只查询你需要的字段就行了啊
Q6:oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据
oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据
1、通常的分页写法,也是第一种分页方法,类似如下方式:
select * from (
select a.*, rownum rn from
(select * from test a order by object_name) a
where rownum <=1000)
where rn > 990;
这种方式,是对表进行排序翻页,比较常见,但是,第一页与第1000页的性能差异还是挺明显的 。
2、第二种的分页写法是对索引进行翻页操作,然后根据rowid 去表中取数据 。这种方式,第一页与第1000页性能相差不大 。
以下语句虽然使用HINT指定使用索引, 但是仍然没有生效 。
selectb.* from (
select * from (
select a.*, rownum rn from
(select /*+ index(a ix_object_name) */ rowid rid from test a order by object_name) a
where rownum <=20)
where rn > 10) a, test b
where a.rid = b.rowid;
关于oracle分页和oracle分页查询优化的介绍到此就结束了,不知道你从中找到你需要的信息了吗?如果你还想了解更多这方面的信息,记得收藏关注本站 。
查看更多关于oracle分页的详细内容...
Tags:oracle分页oracle分页查询优化


推荐阅读