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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bitmap位图索引技术占用的存储空间_bitmap位图

    bitmap位图索引技术占用的存储空间_bitmap位图参考https://www.cnblogs.com/lbser/p/3322630.htmlhttps://blog.csdn.net/catoop/article/details/1116897771、案例有张表名为table的表,由三列组成,分别是姓名、性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚、未婚、离婚这三项,该表共有100w个记录。现在有这样的查询:select*fromtablewhereGender=‘男’andMarital=“未婚”;姓

    2022年10月30日
    0
  • (小米系统系列一)小米/红米BL解锁,解BL锁方法(亲测可用)

    (小米系统系列一)小米/红米BL解锁,解BL锁方法(亲测可用)文章参考自原作者,原作者链接:https://www.bilibili.com/read/cv3305336/,https://www.xiaomi.cn/post/17982230第一步:解锁bootloader手机端操作????设置->关于手机->全部参数->猛戳MIUI版本>成功变身开发者模式;设置->更多设置->开发者选项->设备…

    2022年6月9日
    114
  • 项目警告:There are multiple modules with names that only differ in casing.This can lead to unexpected be…

    项目警告:There are multiple modules with names that only differ in casing.This can lead to unexpected be…

    2021年6月17日
    112
  • 只看这一篇就够:快速了解联邦学习技术及应用实践[通俗易懂]

    只看这一篇就够:快速了解联邦学习技术及应用实践[通俗易懂]随着大数据的进一步发展,重视数据隐私和安全已经成为了世界性的趋势,同时,大多数行业数据呈现数据孤岛现象,如何在满足用户隐私保护、数据安全和政府法规的前提下,进行跨组织的数据合作是困扰人工智能从业者的一大难题。而“联邦学习”将成为解决这一行业性难题的关键技术。今天和大家分享下咱们微众银行AI团队主导的新一代联邦学习技术及应用,并详细介绍联邦学习落地的全球首个工业级开源平台——Federated…

    2022年10月30日
    0
  • 电商网站测试要点_电商项目测试点

    电商网站测试要点_电商项目测试点电商网站测试总结:总体按照两种模式进行划分总结:1.按照测试类型2.按照电子商务网站的系统架构 1.按照测试类型来划分 1.兼容性  1.1主要是在浏览器兼容(360浏览器IE6IE8浏览器)  1.2.操作系统,主要体现在操作系统兼容(xpwin2003win2007) 2.UI测试 2.1检查连接是否正确 2.2是否有文字错误信息 2.3产品…

    2022年10月1日
    0
  • 一二三型观测线的图片_拓扑图

    一二三型观测线的图片_拓扑图“您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。比荷卢经济联盟有很多公交线路。每天公共汽车都会从一座城市开往另一座城市。沿途汽车可能会在一些城市(零或更多)停靠。旅行社计划旅途从 S 城市出发,到 F 城市结束。由于不同旅客的景点偏好不同,所以为了迎合更多旅客,旅行社将为客户提供多种不同线路。游客可以选择的行进路线有所限制,要么满足所选路线总路程为 S 到 F 的最小路程,要么满足所选路线总路程仅比最小路程多一个单位长度。如上图所示,如果 S=1,F=5,则这里有两条最短路线 1→

    2022年8月9日
    9

发表回复

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

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