`

Oracle排序后分页查询与效率问题

阅读更多

 

原始未分页查询Sql代码如下:

 

select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX   
t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1   
order by ID  
 

结果如下:
RN    ID      YYB       XM     MC
---------- ----------------- ----------------------
3     49  某证券总部     管理员 测试
4     96  某证券总部     管理员 持有上港10000股以上
5    102 某证券总部     管理员 十年规划
14   105 某证券总部     管理员 开发渠道为上海
11   106 某证券总部     管理员 万科A
12   107 某证券总部     管理员 11
13   108 某证券总部     管理员 今天过生日的客户
2    109 某证券总部     管理员 客户状态正常
6    110 某证券总部     管理员 无交易
7    111 某证券总部     管理员 OA
8    112 某证券总部     管理员 幸运客户
9    113 某证券总部     管理员 风险型
10   114 某证券总部     管理员 tst
22   115 白沙网上交易   安昌彪 安客户正常
1    118 某证券总部     管理员 213
18   119 某证券总部     管理员 客户号包含1008
17   120 某证券总部     管理员 aaa
19   123 某证券总部     管理员 ssssssss
20   124 某证券总部     管理员 www
21   126 某证券总部     管理员 123123
15   127 某证券总部     管理员 1212
16   128 某证券总部     管理员 aaaaaa

22 rows selected

 

最初我使用如下Sql代码查询:

select * from (select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC    
from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and    
t.gx = 1 order by t.ID )Where rn>10 and rn<=20;  

 

这种方法能成功分页,结果如下:
RN    ID        YYB       XM      MC
---------- ----------------- -------------------
14   105 某证券总部     管理员 开发渠道为上海
11   106 某证券总部     管理员 万科A
12   107 某证券总部     管理员 11
13   108 某证券总部     管理员 今天过生日的客户
18   119 某证券总部     管理员 客户号包含1008
17   120 某证券总部     管理员 aaa
19   123 某证券总部     管理员 ssssssss
20   124 某证券总部     管理员 www
15   127 某证券总部     管理员 1212
16   128 某证券总部     管理员 aaaaaa

10 rows selected

 

从结果看来,有个问题:此语句Sql代码
order by CJSJ DESC  被执行,但是是在分后的第11到20条记录的结果集中再进行排序,而不是先排序后分页。(本来希望显示ID为112到126,结果变为105到128)

 

后来变为以下Sql代码查询: 

 

SELECT *    
FROM(    
SELECT ROWNUM RN,TA.*    
FROM(   
select t.id ID, o.name YYB,u.name XM, t.MC   
from tZDYSX t,tuser u,lborganization o    
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID   
)TA WHERE ROWNUM <= 20   
)WHERE RN > 10  

 

结果如下:
RN    ID     YYB           XM     MC
---------- ----------------- -------------------
11   112 某证券总部     管理员 幸运客户
12   113 某证券总部     管理员 风险型
13   114 某证券总部     管理员 tst
14   115 白沙网上交易   安昌彪 安客户正常
15   118 某证券总部     管理员 213
16   119 某证券总部     管理员 客户号包含1008
17   120 某证券总部     管理员 aaa
18   123 某证券总部     管理员 ssssssss
19   124 某证券总部     管理员 www
20   126 某证券总部     管理员 123123

10 rows selected

 

看来结果是正确的。

总结:第二种方法其中最内层的查询Sql代码

select t.id ID, o.name YYB,u.name XM, t.MC   
from tZDYSX t,tuser u,lborganization o    
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID 

 

表示不进行翻页的原始查询语句。ROWNUM <= 20和RN > 10控制分页查询的每页的范围。
第二种方法在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 20这句上。

 

选择第11到20条记录存在两种方法,第二种方法正是在查询的第二层通过ROWNUM <= 20来控制最大值,在查询的最外层控制最小值。而第一种方法是去掉查询第二层的WHERE ROWNUM <= 20语句,在查询的最外层控制分页的最小值和最大值。

 

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

 

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

 

这种分页对于单表查询、多表查询一样有效。

 

原文地址: http://database.51cto.com/art/200903/112950.htm

分享到:
评论

相关推荐

    如何解决Oracle分页查询中排序与效率问题

    本文主要解决 Oracle 分页查询中排序与效率问题,通过实践和分析,提供了两种解决方案,并对比了两种方法的优缺点。 知识点 1: Oracle 分页查询的基本概念 Oracle 分页查询是指在查询结果中,通过限制行数来实现...

    解决Oracle分页查询中排序与效率问题

    ### 解决Oracle分页查询中排序与效率问题 在Oracle数据库中进行分页查询时,经常会出现性能瓶颈,尤其是在处理大数据量的情况下。本篇文章将详细探讨如何优化Oracle分页查询中的排序与效率问题。 #### 一、理解...

    Oracle的分页查询语句 Oracle分页的存储过程

    Oracle数据库在处理大数据量查询时,分页查询是一种常见的优化策略,目的是限制返回结果集的大小,加快查询速度,提供更好的用户体验。本文将详细探讨Oracle的分页查询语句及其存储过程。 首先,Oracle的分页查询...

    Oracle的SQL分页实践

    创建索引可以显著提升排序速度,从而提高分页查询的效率: ```sql CREATE INDEX idx_your_table_sort_column ON your_table (some_column); ``` 另外,Oracle 12c引入了一种名为"物理行限制"的新特性,即`FETCH ...

    Oracle数据库中分页查询介绍

    在Oracle数据库中,分页查询是一项关键功能,尤其在构建高效的数据检索系统,如自定义搜索引擎时,确保用户能够分批浏览大量数据。由于Web应用的无状态特性,每个请求都是独立的,维持数据库游标以供后续请求是低效...

    oracle分页查询

    Oracle 分页查询是指从大型数据表中提取指定范围的记录,以便提高查询效率和减少数据传输量。常用的 Oracle 分页查询方法有三种:使用 ROWNUM、使用 ROW_NUMBER() 和使用子查询。 第一种方法:使用 ROWNUM Oracle...

    Oracle 3种分页SQL方法比较

    为了解决ROWNUM无法与ORDER BY一起使用的问题,我们可以先对数据进行排序,然后在子查询中应用ROWNUM。以下是一个例子: ```sql SELECT * FROM ( SELECT t.*, ROWNUM rnum FROM YourTable t ORDER BY Some...

    oracle分页 排序

    #### 二、Oracle排序查询原理及应用 在Oracle中,排序可以通过`ORDER BY`子句来实现。结合分页查询时,我们需要在分页之前对数据进行排序。 **2.1 按照name字段升序排列后的前10条记录** ```sql SELECT * FROM ...

    Oracle分页(limit方式的运用)

    通过以上介绍,我们可以看到在Oracle中使用`OFFSET`与`FETCH FIRST`结合`ROWNUM`可以有效地实现分页查询。这种方法不仅简单易用,而且能够满足大多数场景下的需求。当然,在实际应用中还需要根据具体情况进行调整和...

    带排序的oracle分页存储过程

    下面将详细介绍如何利用Oracle数据库中的存储过程来实现一个支持排序功能的分页查询。 #### 存储过程设计原理 在Oracle中,存储过程是一种预先定义并编译好的SQL代码块,它可以接受参数,并返回结果。使用存储过程...

    千万数量级分页存储过程,可支持多表查询,任意排序

    因此,设计一种能够支持多表查询和任意排序功能的分页存储过程变得尤为重要。 ### 二、千万数量级分页存储过程的关键技术 #### 1. 多表查询支持 - **定义**:多表查询是指在一个SQL语句中同时查询多个表的数据。 -...

    jsp+jdbc_oracle增删改查过滤分页排序

    本教程"jsp+jdbc_oracle增删改查过滤分页排序"旨在帮助初学者掌握如何利用JSP与Oracle数据库进行数据操作,包括增、删、改、查以及查询结果的过滤、分页和排序。 首先,我们需要理解JDBC(Java Database ...

    oracle 高效分页

    在Oracle中,`ROW_NUMBER()`和`ROWNUM`是实现分页查询的两种主要方式。其中,`ROW_NUMBER()`函数是在SQL标准中的窗口函数,它可以为每一行分配一个唯一的行号,而这个行号的顺序可以基于某一列的排序规则。`ROWNUM`...

    TERADATA、ORACLE数据库分页

    本篇将深入探讨TERADATA和ORACLE这两种广泛应用的关系型数据库在实现分页查询时的方法。 TERADATA是一个并行数据库系统,以其高效的大数据处理能力著称。在TERADATA中,进行分页查询主要通过使用`TOP`或`LIMIT`...

    oracle的伪列与分页

    ### Oracle的伪列与分页 #### 一、Oracle伪列概述 在Oracle数据库中,伪列(Pseudocolumn)并非真正意义上的列,而是一种特殊的数据库对象,它看起来像表中的一个列,但实际上并不存储数据。Oracle提供了一些内置...

    mySql与oracle分页技术

    因此,对于大数据分页,更推荐使用基于主键的排序和范围查询来提高效率。 Oracle数据库的分页技术有所不同。Oracle没有直接提供类似`LIMIT`的语法,但它可以通过`ROWNUM`伪列或者结合`FETCH NEXT`和`OFFSET`子句来...

    oracle数据库级分页(java)

    为了解决这个问题,Oracle引入了RANK(), DENSE_RANK()和ROW_NUMBER()等分析函数,它们可以在排序后分配行号,从而实现分页。例如,使用ROW_NUMBER(): ```sql SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER ...

    Oracle SQL语句分页问题

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

    Oracle分页查询技术

    ### Oracle分页查询技术 ...通过合理地设计查询逻辑和利用Oracle提供的各种工具,我们可以有效地处理大数据量下的分页查询问题,提高系统的整体性能。理解并掌握这些技巧,对于开发高效稳定的数据库应用程序至关重要。

Global site tag (gtag.js) - Google Analytics