Oracle分页查询的实例详解

作者:zw7534313 时间:2024-01-24 15:41:27 

Oracle分页查询的实例详解

1.Oracle分页查询:


SELECT * FROM
( SELECT A.*, ROWNUM RN FROM
   (SELECT * FROM tab) A
   WHERE ROWNUM <= 40 )
      WHERE RN >= 21;

这个分页比下面的执行时间少,效率高。 

2.


select * from
   (select c.*,rownum rn from tab c) where rn between 21 and 40

 对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。】因此,对于第二个查询语句,
Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,
显然这个效率要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

3.下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式

NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。
在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时
可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。
那么在大部分的情况下,对于Oracle分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率
(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。


SELECT /*+FIRST_ROWS*/ * FROM     ---hint 提示,优化查询
( SELECT A.*, ROWNUM RN FROM
   (SELECT * FROM tab) A
   WHERE ROWNUM <= 400 )
      WHERE RN >= 380

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://zw7534313.iteye.com/blog/911542

标签:Oracle,分页查询
0
投稿

猜你喜欢

  • asp如何编写一个DNS LOOKUP程序?

    2009-11-07 18:47:00
  • MySQL之导出整个及单个表数据的操作

    2024-01-17 00:52:02
  • Python基于pillow库实现生成图片水印

    2021-08-01 10:45:38
  • Python实现对二维码数据进行压缩

    2022-10-22 12:51:59
  • Python类中的魔法方法之 __slots__原理解析

    2023-10-01 18:49:51
  • python直接调用和使用swig法方调用c++库

    2021-05-26 11:08:26
  • ASP操作XML的方法

    2008-03-06 21:43:00
  • Pycharm中安装pywin32报错问题及解决

    2022-09-29 19:58:14
  • Pandas过滤dataframe中包含特定字符串的数据方法

    2021-10-11 13:39:08
  • PHP利用ChatGPT实现轻松创建用户注册页面

    2023-05-25 09:22:16
  • SQLSERVER全文目录全文索引的使用方法和区别讲解

    2024-01-12 18:12:28
  • MySQL WorkBench管理操作MySQL教程

    2024-01-14 10:32:13
  • Python基于Pymssql模块实现连接SQL Server数据库的方法详解

    2024-01-15 03:13:17
  • Python中使用PIL库实现图片高斯模糊实例

    2023-12-09 14:12:20
  • Vue中watch使用方法详解

    2024-04-30 10:40:45
  • SQL Server之SELECT INTO 和 INSERT INTO SELECT案例详解

    2024-01-22 01:11:56
  • Python3基础之list列表实例解析

    2022-04-22 16:07:15
  • 使用python加密主机文件几种方法实现

    2021-03-06 03:16:12
  • 详解Go语言变量作用域

    2023-08-05 03:25:43
  • Jupyter Notebook运行代码无反应问题及解决方法

    2023-07-21 17:38:04
  • asp之家 网络编程 m.aspxhome.com