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
分享到:
相关推荐
HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...
在本项目中,我们主要探讨的是如何利用Spring MVC和MyBatis两大流行框架构建一个具有分页查询功能的Web应用。Spring MVC作为控制层,负责处理HTTP请求和响应,而MyBatis则作为数据访问层,用于处理数据库交互。下面...
在网页开发中,分页查询是一项常见的功能,它允许用户以较小的数据量加载页面,提高用户体验,特别是处理大量数据时。Ajax(Asynchronous JavaScript and XML)技术被广泛应用于实现无刷新分页,使得用户在浏览数据...
针对这一需求,本文将详细介绍如何在SQL Server中实现有效的分页查询。 ### 方法1:使用NOT IN 这种方法通过先选择前300100条记录的序列号(这里假设`fldserialNo`是唯一标识每一行的字段),然后在外层查询中排除...
本文将详细探讨在PHP中如何对Elasticsearch(ES)中的数据进行分页查询,以及相关的封装技巧。 首先,我们需要理解Elasticsearch的数据分页原理。在ES中,分页主要通过两个参数实现:`from` 和 `size`。`from` 参数...
在本文中,我们将深入探讨如何在SpringBoot项目中整合MyBatis-Plus,实现多表分页查询。MyBatis-Plus是一个强大的MyBatis扩展,简化了对数据库的操作,包括CRUD操作以及复杂的关联查询。它提供了丰富的API,使得开发...
在这个特定的例子中,我们关注的是如何利用LigerUI进行储存过程分页查询,这在处理大量数据时非常有用,因为可以有效地减少服务器负载并提高用户界面的响应速度。 首先,`web.config`是ASP.NET应用程序的核心配置...
在网页开发中,分页查询是一项非常常见的功能,它能够帮助用户更有效地浏览大量数据,而不会一次性加载所有内容导致页面响应慢或者消耗过多资源。本篇将深入讲解如何使用Java进行分页查询,以及与数据库的交互。 ...
但是,在使用 PageHelper 进行分页查询时,会出现一些问题,例如当进行一对多结果映射的分页查询时,PageHelper 会自动对 SQL 语句进行处理,但由于左连接查询时,连接条件 on 条件不唯一(即一对多)时,结果会产生...
`Spring`、`Mybatis`和`PageHelper`的结合可以帮助我们轻松实现高效、便捷的分页查询。`PageHelper`是Mybatis的一个插件,它通过拦截器的方式,自动实现了分页查询的功能,减轻了开发人员的工作负担。接下来,我们将...
在本项目中,“Servlet实现分页查询”是指利用Servlet来实现在Web应用中对大量数据进行分页显示的功能,这在数据库操作和用户界面交互中是非常常见的需求。Model2模式是MVC(模型-视图-控制器)设计模式的一种变体,...
Node.js结合MySQL实现分页查询是一种常见的数据处理方式,在Web应用中尤为常见。分页可以有效提高页面的响应速度,并优化用户的浏览体验。本文主要介绍了在Node.js环境下,如何使用MySQL数据库实现分页功能。 首先...
在IT行业中,分页查询是一项基础且重要的技术,特别是在大数据量的Web应用中,它能够有效地提高用户体验,避免一次性加载过多数据导致的页面响应慢或者内存压力过大。本项目以"jsp+serlert"为技术栈,实现了带条件的...
本话题将深入探讨如何在C#中利用SQLite进行分页查询以及日期查询。 首先,要与SQLite数据库进行交互,我们需要引入一个SQLite的.NET驱动。`System.Data.SQLite`是一个广泛使用的开源库,可以在NuGet包管理器中找到...
在分页查询中,Hibernate提供了一种称为HQL(Hibernate Query Language)的SQL方言,可以方便地实现复杂的查询,包括分页查询。此外,Hibernate还支持Criteria查询,这是一种更加面向对象的查询方式,同样可以实现...
在IT领域,尤其是在软件开发与数据库操作...特别是在分页查询方面,通过`Skip()`和`Take()`的组合使用,使得数据展示更加高效合理。对于现代Web应用而言,掌握LINQ的分页技巧,无疑能够显著提升应用的性能和用户体验。
### Hibernate 实现分页查询详解 #### 一、引言 在进行数据库操作时,为了提高用户体验和系统性能,分页查询是一项非常重要的技术。Hibernate作为Java领域内一个优秀的对象关系映射(ORM)框架,提供了强大的数据...
这可能需要调整CSS样式,如旋转角度、元素大小等,并考虑使用媒体查询进行适配。 7. **性能优化**:为提高性能,可以利用jQuery的事件委托,将事件监听器添加到滑块容器而不是每个分页上。此外,使用硬件加速可以...
本篇将详细介绍如何在易语言环境下实现MySQL的分页查询功能。 分页查询是数据库操作中的常见需求,它能够帮助用户在大量数据中高效地浏览和加载信息,而不是一次性加载所有记录,从而提高用户体验并减少服务器负担...
Oracle数据库则提供SQL查询语言来操作数据,包括支持分页查询的语句。 实现分页功能,主要涉及以下几个步骤: 1. **设置查询参数**:包括每页显示的记录数(pageSize)和当前页数(pageNumber)。这些参数通常由...