`
litxuf
  • 浏览: 122467 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle 分页语句解析

 
阅读更多

 

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。


分页查询格式:

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

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21 到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40


 

对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对 于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率 要比第一个查询低得多。

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

这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO 一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

SELECT /* FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

分享到:
评论

相关推荐

    oracle 分页语句

    #### 分页查询语句解析 1. **外层查询**: - `SELECT * FROM (子查询) WHERE rn &gt; 2` - 这里使用了一个嵌套查询结构。外层查询主要负责筛选出满足条件的数据行,即`rn &gt; 2`。 - `rn`是内层查询中的行号字段,表示...

    Oracle分页存储过程

    ### Oracle分页存储过程解析与应用 在数据库管理和应用程序开发中,处理大量数据时,分页查询是一项常用且重要的技术。Oracle数据库提供了多种方法来实现数据分页,其中使用存储过程进行分页是一种高效且灵活的方式...

    Oracle分页

    然后,根据这些参数构建SQL查询语句,结合上面提到的Oracle分页方法,获取对应的数据。同时,Servlet可以处理请求和响应,将分页数据以特定格式(如JSON)返回给前端。 三、AJAX异步请求 AJAX(Asynchronous ...

    Oracle SQL语句分页问题

    ### Oracle SQL语句分页问题详解 #### 一、引言 在数据库查询操作中,分页是一项常用且重要的功能,特别是在数据量较大的情况下。它能够有效地提高用户体验,并减轻服务器负担。本文将针对Oracle数据库中的SQL分页...

    Oracle分页详解

    ### Oracle分页详解 在数据库应用开发中,为了提高用户体验并优化系统性能,分页查询是一种常见的技术手段。本文将详细介绍如何在Oracle数据库中实现高效、灵活的分页功能。 #### 一、Oracle分页原理 Oracle中的...

    jsp + oracle分页简单实用

    ### JSP与Oracle数据库分页显示技术解析 #### 一、概述 本文档介绍了一种基于JSP(Java Server Pages)结合Oracle数据库实现的数据分页显示方法。此方法利用了JDBC(Java Database Connectivity)2.0标准进行...

    oracle分页存储过程千万级

    本文将基于给定的“oracle分页存储过程千万级”文件信息,深入解析其核心概念、设计思路及实现细节。 ### 核心概念解析 #### 1. 存储过程(Stored Procedure) 存储过程是一种预编译的SQL代码块,存储在数据库...

    Oracle 分页存储过程

    本文将深入解析一个Oracle分页存储过程的设计思想与具体实现方法。该存储过程通过输入参数控制每页显示的记录数,并返回指定页面的数据,同时提供了总记录数和总页数等信息。 #### 知识点二:存储过程定义与结构...

    oracle认证详解Oracle的几种分页查询语句

    ### Oracle认证详解:Oracle的几种分页查询语句 #### 分页查询背景及重要性 在数据库管理系统(DBMS)中,特别是在Oracle这样的大型关系型数据库中,分页查询是一种非常实用的技术。它允许用户根据需求获取特定...

    解析函数高效实现分页

    本文将详细介绍如何利用Oracle中的`ROW_NUMBER()`解析函数来实现高效的分页功能,并通过示例对比不同分页方法的优劣。 #### 传统分页方法的问题 1. **ROWNUM方法**: - **原理**:通过`ROWNUM`为结果集中的每一行...

    oracle包用存储过程图分页

    根据提供的信息,我们可以详细解析如何在Oracle数据库中创建一个包,并在该包内定义一个存储过程来实现分页功能。这种做法通常用于处理大量数据时,以提高查询效率和用户体验。 ### Oracle包与存储过程 #### 一、...

    oracle分页查询sql

    ### Oracle 分页查询 SQL 在 Oracle 数据库管理中,实现数据的有效分页是非常重要的功能之一。这不仅可以提高数据处理效率,还可以改善用户界面的响应速度。分页查询是指从数据库中检索特定范围内的记录,通常用于...

    jdbc 分页 sql语句

    根据题目中给出的SQL语句,我们可以看到一个典型的Oracle分页查询案例: ```sql select * from ( select rownum rw, a.* from ( select e.* from s_emp e inner join s_dept d on e.dept_id = d.id where ...

    oracle mysql sql server 等数据库的分页要点解析

    **常见数据库分页语句** 1. **Oracle分页** Oracle使用`ROWNUM`伪列进行分页,示例如下: ```sql select * from ( select t.*, rownum k from emp t WHERE 条件 ) WHERE k &gt; (页码 - 1) * pageSize AND k 页码 * ...

    Mysql转oracle工具

    "mysqltooracle_cn"这个工具可能包含了自动化的转换功能,它能帮助解析MySQL的DDL语句并生成相应的Oracle DDL,同时也可能包含数据迁移的逻辑。 在实际操作中,应先备份源数据库,然后根据工具的使用指南逐步进行...

    oracle 高效分页

    除了直接使用SQL语句外,创建存储过程也是一种常见的分页实现方式。例如,提供的包定义`pkg_test`包含了分页功能的封装: ```plsql CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF CURSOR; ...

    Oracle存储过程分页

    ### Oracle存储过程分页知识点详解 #### 一、Oracle存储过程分页原理及实现方法 在Oracle数据库中,实现分页查询通常有两种方法:一种是使用`ROWNUM`伪列,另一种则是通过存储过程实现。其中,使用存储过程进行...

    PHP实现的oracle分页函数实例

    本文将会详细解析PHP中实现Oracle分页的关键知识点,并提供相应的代码实例。 ### PHP实现Oracle分页知识点 1. **Oracle的ROWNUM与分页** Oracle数据库中,ROWNUM是查询返回结果集中每一行的序列号。在Oracle 12c...

    extjs oracle分页---Json转换

    标题“ExtJS Oracle分页---Json转换”涉及的是在Web应用程序开发中,使用ExtJS框架与Oracle数据库进行分页数据交互,并通过Json格式进行数据转换的技术。以下是对这个主题的详细解释: ExtJS是一个强大的JavaScript...

    oracle 分页包

    ### Oracle分页包知识点解析 #### 一、概述 在Oracle数据库中,为了方便地进行数据分页查询,经常需要创建一个专用的分页包。本文档介绍的Oracle分页包是一个非常实用的工具,它提供了多种方法来实现对数据库记录...

Global site tag (gtag.js) - Google Analytics