Oracle分页查询性能优化

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

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

1
2
3
4
5
6
7
Select * from (
rownum rn,t.* from table t)
Where rn>&minnum and rn<=&maxnum
或者
(
t rownum<=&maxnum)
rn>&minnum

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

1
sql> create test as select dba_objects;

并反复地插入相同数据。

insert into test;

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

4
select count (*) test
COUNT (*)
----------
831104

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

@H_502_171@ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(
2 test t)
3 where rn>0 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个,结果满足了,但是效率是很差的,如果采用第二种方式:

22
23
test t
rownum <=50)
4 rn>0;
已选择50行。
已用时间: 00: 00: 01.00
Execution Plan
----------------------------------------------------------
STATEMENT Optimizer=CHOOSE (Cost=10 Card=50 Bytes=9500)
(Cost=10 Card=50 Bytes=9500)
(STOPKEY)
(Cost=10 Card=65 Bytes=5590)
Statistics
@H_640_403@----------------------------------------------------------
0 recursive calls
0 db block gets
82 consistent gets
0 physical reads
size
得到了同样的结果,一致性读只有82个,从以上的例子可以看到,通过把rownum引入到第二层,却得到了一个完全不一样的执行计划,注意在执行计划中的stopkey,它是8i引入的新操作,这种操作专门为提取Topn的需求做了优化。

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

16
rownum <=10000)
rn>9950;
已用时间: 00: 00: 01.01
Statistics
0 recursive calls
0 db block gets
2616 consistent gets
0 physical reads
size
选择靠后一点的数据时,逻辑读开始变大,当选择到最后几页时,一致性读已经与上面的相似了。

rownum <=800000)
rn>799950;
已用时间: 00: 00: 01.03
10242 consistent gets
不过,所幸的是,大部分的用户只看开始5%的数据,而没有兴趣看最后面的数据,通过第二种改良的分页技术,可以方便快速显示前面的数据,而且不会让用户感觉到慢。

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...