oracle 分页查询 优化_oracle分页查询封装

oracle 分页查询 优化_oracle分页查询封装对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如 此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情 况下,他们只看前几页。 通常有以下两种分页技术可供选择。 1234567Select * from (Select rownumrn,t.* from table t)Where rn>&minnum and rn或者Sel

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如 此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情 况下,他们只看前几页。 

通常有以下两种分页技术可供选择。 

1
2
3
4
5
6
7
Select 

from 
(
Select 
rownum rn,t.* 
from 
table 
t)
Where 
rn>&minnum 
and 
rn<=&maxnum
或者
Select 

from 
(
Select 
rownum rn,t.* 
from 
table 
t rownum<=&maxnum)
Where 
rn>&minnum

看似相似的分页语句,在响应速度上其实有很大的差别。来看一个测试过程,首先创建一个测试表。 

1
SQL>
create 
table 
test 
as 
select 

from 
dba_objects;

并反复地插入相同数据。 

1
SQL>
insert 
into 
test 
select 

from 
test;

最后,查询该表,可以看到该表的记录数约为 80 万条。 

1
2
3
4
SQL> 
select 
count
(*) 
from 
test
  
COUNT
(*)
----------
    
831104

现在分别采用两种分页方式,在第一种分页方式中: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> 
select 

from 
(
  
2  
select 
rownum rn,t.* 
from 
test t)
  
3  
where 
rn>0 
and 
rn <=50;
   
已选择50行。
已用时间:  00: 00: 01.03
   
Execution Plan
----------------------------------------------------------
   
0      
SELECT 
STATEMENT Optimizer=CHOOSE (Cost=10 Card=65 Bytes=12350)
   
1    0   
VIEW 
(Cost=10 Card=65 Bytes=12350)
   
2    1     
COUNT
   
3    2       
TABLE 
ACCESS (
FULL

OF 
'TEST' 
(Cost=10 Card=65 Bytes=5590)
   
Statistics
----------------------------------------------------------
          
0  recursive calls
          
0  db block gets
      
10246  consistent gets
          
0  physical reads
          
0  redo 
size
          
……

可以看到,这种方式查询第一页的一致性读有 10246 个,结果满足了,但是效率是很差的,如果采用第二种方式: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> 
select 

from 
(
  
2  
select 
rownum rn,t.* 
from 
test t
  
3  
where 
rownum <=50)
  
4  
where 
rn>0;
  
已选择50行。
已用时间:  00: 00: 01.00
  
Execution Plan
----------------------------------------------------------
   
0      
SELECT 
STATEMENT Optimizer=CHOOSE (Cost=10 Card=50 Bytes=9500)
   
1    0   
VIEW 
(Cost=10 Card=50 Bytes=9500)
   
2    1     
COUNT 
(STOPKEY)
   
3    2       
TABLE 
ACCESS (
FULL

OF 
'TEST' 
(Cost=10 Card=65 Bytes=5590)
  
Statistics
----------------------------------------------------------
          
0  recursive calls
          
0  db block gets
         
82  consistent gets
          
0  physical reads
          
0  redo 
size
          
……

得到了同样的结果,一致性读只有 82 个,从以上的例子可以看到,通过把 rownum 引入到第 二层,却得到了一个完全不一样的执行计划,注意在执行计划中的 stopkey,它是 8i 引入的新操 作,这种操作专门为提取 Top n 的需求做了优化。 

从上面的例子可以再想到,因为 stopkey 的功能影响到了分页的一致性读的多少,会不会越往后翻页速度就越慢呢?事实也的确如此,例如: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
select 

from 
(
  
2  
select 
rownum rn,t.* 
from 
test t
  
3  
where 
rownum <=10000)
  
4  
where 
rn>9950;
  
已选择50行。
已用时间:  00: 00: 01.01
  
Statistics
----------------------------------------------------------
          
0  recursive calls
          
0  db block gets
       
2616  consistent gets
          
0  physical reads
          
0  redo 
size
         
……

选择靠后一点的数据时,逻辑读开始变大,当选择到最后几页时,一致性读已经与上面的相似了。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
select 

from 
(
  
2  
select 
rownum rn,t.* 
from 
test t
  
3  
where 
rownum <=800000)
  
4  
where 
rn>799950;
  
已选择50行。
已用时间:  00: 00: 01.03
  
Statistics
----------------------------------------------------------
          
0  recursive calls
          
0  db block gets
      
10242  consistent gets
          
0  physical reads
          
0  redo 
size
          
……

不过,所幸的是,大部分的用户只看开始 5%的数据,而没有兴趣看最后面的数据,通过第二种改良的分页技术,可以方便快速地显示前面的数据,而且不会让用户感觉到慢。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213589.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dex文件格式

    dex文件格式dex文件格式Android4.0源码Dalvik/docs目录下文档dex-format.html有详细介绍dex文件格式1.dex文件中的数据结构dex文件使用到的数据类型u1~u8表示1到8字节的无符号数,而sleb128、uleb128与uleb128p1则是dex文件中特有的LEB128数据类型。每个LEB128由1~5个字节组成,所有的字节组合在一起表示一…

    2022年6月28日
    55
  • Java+Servlet+JSP+Mysql+Tomcat实现Web学生选课管理系统

    Java+Servlet+JSP+Mysql+Tomcat实现Web学生选课管理系统Java实现Web学生选课管理系统一、系统介绍1.软件环境2.系统功能3.数据库二、系统展示1.登录页面2.学生-主页面3.学生-查看个人信息4.学生-选择课程5.学生-查看已选课程6.教师-主页面7.教师-查看个人信息8.教师-评分9.教师-查看任课信息10.管理员-主页面11.管理员-管理员功能-查看个人信息12.管理员-管理员功能-添加新的管理员13.管理员-学生功能-添加学生14.管理员-学生功能-获取所有学生15.管理员-课程功能-添加课程16.管理员-课程功能-查询课程17.管理员-教师功能-添

    2022年10月16日
    4
  • VS2013 产品密钥 – 所有版本

    VS2013 产品密钥 – 所有版本 VisualStudioUltimate2013KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9VisualStudioPremium2013KEY(密钥):FBJVC-3CMTX-D8DVP-RTQCT-92494VisualStudioProfessional2013 KEY(密钥): XD…

    2022年4月3日
    7.5K
  • 群环域

    群环域群环域

    2022年6月18日
    27
  • Dreamweaver8的安装

    Dreamweaver8的安装安装步骤:Step1:双击<Dreamweaver8-chs>Step2:单击<下一步>Step3:选中<我接受该许可证协议中的条款>,单击<下一步>按钮Step4:选中<在桌面上创建快捷方式(针对所有用户)>,单击<下一步>Step5:单击<下一步>S…

    2022年7月26日
    5
  • 分布式锁的实现和应用场景_predis分布式锁的应用

    分布式锁的实现和应用场景_predis分布式锁的应用文章目录如何理解分布式锁分布式锁的常用实现基于关系型数据库存在单点故障风险不可重入无法实现阻塞应用Redis缓存基于ZooKeeper实现电商网站都会遇到秒杀、特价之类的活动,大促活动有一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?分布式锁就是一个解决方案。如何理解分布式锁我们都知道,在业务开发中,为了保证在多线程下处理

    2025年10月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号