oracle 分页查询 优化_oracle分页查询封装
对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如 此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情 况下,他们只看前几页。
通常有以下两种分页技术可供选择。
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
看似相似的分页语句,在响应速度上其实有很大的差别。来看一个测试过程,首先创建一个测试表。
SQL>
create
table
test
as
select
*
from
dba_objects;
并反复地插入相同数据。
SQL>
insert
into
test
select
*
from
test;
最后,查询该表,可以看到该表的记录数约为 80 万条。
SQL>
select
count
(*)
from
test
COUNT
(*)
----------
831104
现在分别采用两种分页方式,在第一种分页方式中:
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 个,结果满足了,但是效率是很差的,如果采用第二种方式:
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 的功能影响到了分页的一致性读的多少,会不会越往后翻页速度就越慢呢?事实也的确如此,例如:
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
……
选择靠后一点的数据时,逻辑读开始变大,当选择到最后几页时,一致性读已经与上面的相似了。
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.cn/213589.html原文链接:https://javaforall.cn
相关文章
- Oracle数据库分页查询语句实现(oracle的分页语句)
- Oracle数据库中的分组排序查询(oracle分组排序查询)
- 怎么在 Oracle 数据库中使用包含空格的对象?(oracle包含空格)
- Oracle学习精要:轻松掌握关键技能(oracle学习教材)
- 深入浅出:Oracle 查询密码详解(oracle查询密码)
- 优化Oracle数据库:利用分区表(oracle分区表)
- 深入探讨Oracle的审计功能(oracle的审计功能)
- Oracle数据库 之 日期查询的技巧(oracle日期查询语句)
- 深入理解Oracle EM查询功能(oracle 查看em)
- cxOracle实现Oracle数据库的高效输出(cx oracle 输出)
- Oracle中利用集合类型实现数据结构高效管理(oracle中集合类型)
- Oracle 求和智能化提升效能(oracle 例求和)
- Oracle GoldenGate利用Ogg实现数据库可靠同步(oracle 之ogg)
- Oracle付费查询的同义词汇探析(oracle付查询同义词)
- 探究Oracle中子查询的魅力(oracle中的子查询)
- Oracle中精准表述分钟时间的方法(oracle中的分钟表示)
- 探索Oracle中的空无一物(oracle中没有任何表)
- 字符串Oracle中如何查询带空格的字符串(oracle中查询带空格)
- 活在现实中,谋求精进学习Oracle(live oracle)
- Oracle循环查询更快捷高效体验一番吧(oracle中循环查询)
- 年底最大销售额Oracle查询去年年底最高销售额(oracle中定义去年)
- Oracle事务处理 提升灵活度与效率(oracle事务处理调整)
- 可以提高性能Oracle中如何利用对象提升性能(oracle中哪些对象)