对于数据库中表的数据的 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 (FULLOF '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 (FULLOF '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%的数据,而没有兴趣看最后面的数据,通过第二种改良的分页技术,可以方便快速地显示前面的数据,而且不会让用户感觉到慢。

Oracle分页查询性能优化相关推荐

  1. Oracle分页查询性能优化及一些规则

    1.一个分页查询语句引发的思考 2.优化分析过程 3.Rowid和Rownum的区别 4.多表关联查询对比 5.SQL优化常用规则 1.一个分页语句引发的思考 执行计划显示耗时是2.491秒,这是Or ...

  2. Oracle 模糊查询性能优化

    问题:使用like模糊查询,性能不是很好,寻求更高效的模糊查询的方法 解决:使用oracle自带的instr()函数解决 参考:https://blog.csdn.net/u010028869/art ...

  3. oracle 亿级数据分页,oracle分页查询千万级优化-Oracle

    oracle分页查询千万级优化,在做比对项目时,有表是3千万多的数据,在页面做分页查询时很卡40s,反正差不多一分钟的时间,后来更了sql,优化了代码就好了很多,4s就可以了. 代码里优化是把总条数存 ...

  4. Oracle 分页查询的高效写法

    最近遇到了这个问题,整理下Oracle 分页查询的高效写法 一. 低效与高效写法对比 低效的写法 select column_lists from  (select rownum as rn,A.* ...

  5. oracle分页查询sql语句通用,oracle分页查询sql语句,oracle分页查询sql语句详解

    oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句 Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点 ...

  6. Oracle分页查询语句(六)

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询语句(一):http://yangtingkun.itpub.net/post/468/100278 Oracl ...

  7. SQL Server 查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化--覆盖索引(一)  中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索 ...

  8. 读薄《高性能MySql》(四)查询性能优化

    读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...

  9. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

最新文章

  1. 9名华人当选,包揽总人数1/6!2017 ACM Fellow名单公布,华人强势亮相
  2. C# Winform下一个热插拔的MIS/MRP/ERP框架14(自动更新)
  3. Leetcode 179. 最大数 解题思路及C++实现
  4. LeetCode - 121. 买卖股票的最佳时机
  5. 图神经网络(一)图信号处理与图卷积神经网络(2)图信号与图的拉普拉斯矩阵
  6. 巨人网络第三季度营收5.06亿元 净利润3亿元
  7. python对csv文件中的数据进行分类_使用Python读取csv文件并进行分类存储
  8. 国内设计灵感网站,设计师学习必备
  9. MySQL 主键入门到精通
  10. spring mybatis 项目源码
  11. PreScan传感器(二)——TIS传感器
  12. 区块链技术在“三资”监管领域的应用
  13. java 多线程 串行 加锁_[Java并发编程实战] 线程安全
  14. 计算机系统二进制炸弹实验报告,二进制拿炸弹实验报告完整版.doc
  15. 计算机基础——计算机网络
  16. 编写第一个JSP文件
  17. 在线教育网站的一些瞎折腾……
  18. VLAN Aggregation(VLAN 聚合,也称Super VLAN)
  19. 51单片机使用和配置HC-05蓝牙模块
  20. 从10万个数中找10个最大的数

热门文章

  1. 亚马逊测评需要注意的事项
  2. 人渣!鄂尔多斯一男子发布前女友裸照,被警方拘留!
  3. Linux-终端命令行
  4. 怎么选择合适的PLM系统
  5. 牛客练习赛24(18.08.10)
  6. java实战——简单的媒体播放器
  7. 可动平行平板电容建模策略
  8. 几个常见的B端推广渠道
  9. 二、三级等保建议安全设备及其主要依据(毫无保留版)
  10. 不积硅步无以至千里,不积小流无以成江海