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

oracle高效分页查询总结

 
阅读更多

本文参考链接:http://blog.sina.com.cn/s/blog_8604ca230100vro9.html

探索查询语句:

复制代码
--分页参数:size = 20 page = 2
--没有order by的查询
-- 嵌套子查询,两次筛选(推荐使用)
--SELECT *
-- FROM (SELECT ROWNUM AS rowno, t.*
-- FROM DONORINFO t
-- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
-- AND TO_DATE ('20060731', 'yyyymmdd')
-- AND ROWNUM <= 20*2) table_alias
-- WHERE table_alias.rowno > 20*(2-1);        --耗时0.05s

-- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)
--select * from(
--SELECT ROWNUM AS rowno, t.*
--FROM DONORINFO t
--WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd')
--) r
--where r.rowno BETWEEN 20*(2-1)+1 and 20*2;      --耗时0.46s


--有order by的查询
--嵌套子查询,两次筛选(推荐使用)
--SELECT *
--FROM (SELECT ROWNUM AS rowno,r.*
-- FROM(
-- SELECT * FROM DONORINFO t
-- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
-- AND TO_DATE ('20060731', 'yyyymmdd')
-- ORDER BY t.BIRTHDAY desc
-- ) r
-- where ROWNUM <= 20*2 
-- ) table_alias
-- WHERE table_alias.rowno > 20*(2-1);                --耗时0.744s

-- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)
--select * from (
--SELECT ROWNUM AS rowno,r.*
--FROM(
--SELECT * FROM DONORINFO t
--WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
--AND TO_DATE ('20060731', 'yyyymmdd')
--ORDER BY t.BIRTHDAY desc
--) r
----where ROWNUM <= 20; --这里用>查不到数据 =也查不到数据 <= 或者 < 可以查到数据 
----where ROWNUM BETWEEN 20*(2-1)+1 AND 20*2; --查不到数据
----where ROWNUM <=20*2 and ROWNUM > 20*(2-1); --查不到数据
----这是因为查询时,第一条生成的rownum为1,1>20不成立,1=20也不成立,所以这条数据就作废了,依次类推,这样就查不到任何一条数据
--) t 
--where t.rowno <=20*2 and t.rowno > 20*(2-1); --可以查到数据耗时:3.924s
---- where t.rowno BETWEEN 20*(2-1)+1 AND 20*2; --可以查到数据耗时:3.919s

--采用row_number() over 分页函数
--select * 
--from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber 
--     from DONORINFO d
--     WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
--                             AND TO_DATE ('20060731', 'yyyymmdd')
-- ) p 
--where p.rownumber BETWEEN 20*(2-1)+1 AND 20*2;  --耗时0.812s

select * from (
select * 
from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber 
     from DONORINFO d
     WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
                             AND TO_DATE ('20060731', 'yyyymmdd')
 ) p 
where p.rownumber <20*2
) where rownumber > 20*(2-1);    -- 耗时0.813s
复制代码

 

从以上探索比较,我们得知:

1、ROWNUM

  rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。

    可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。

    它取得第一条记录则rownum值为1,第二条为2。依次类推。

    当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。

    下条的rownum还会是1,又被删除,依次类推,便没有了数据。

  所以上限条件必须放在子查询,而下限条件必须放在外层查询。

2、between  and 和 >= and <=

这两者查询效率上来说没有区别,between and 最终也是转为>= and <=

所以select * from (select * from a where a.time >= to_date('19920324','yyyymmdd')) b where b.time <= to_date('20170324','yyyymmdd')

这样的嵌套是没有必要的,可以直接用between and。

3、Oracle通用分页格式

对于没有order by语句的分页:

复制代码
SELECT *
FROM (SELECT ROWNUM AS rowno, t.*
          FROM DONORINFO t
          WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
          AND TO_DATE ('20060731', 'yyyymmdd')
          AND ROWNUM <= page*size) table_alias
WHERE table_alias.rowno > (page-1)*size;    
复制代码

有order by语句的分页

复制代码
SELECT *
FROM (SELECT ROWNUM AS rowno,r.*
           FROM(SELECT * FROM DONORINFO t
                    WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
                    AND TO_DATE ('20060731', 'yyyymmdd')
                    ORDER BY t.BIRTHDAY desc
                   ) r
           where ROWNUM <= page*size 
          ) table_alias
WHERE table_alias.rowno > (page-1)*size;
复制代码

另外我们也可以使用row_number() over函数:

复制代码
select*from(select d.*,row_number() over(orderby d.BIRTHDAY) as rownumber 
       from DONORINFO d
       WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
        AND TO_DATE ('20060731', 'yyyymmdd')
 ) p 
where p.rownumber BETWEEN size*(page-1)+1AND page*size;


http://www.cnblogs.com/jay763190097/p/6813792.html
复制代码

但是相比前面的并没有什么优势。

分享到:
评论

相关推荐

    oracle分页查询sql

    通过以上分析可以看出,在Oracle中实现高效的分页查询需要综合考虑查询结构、索引使用以及查询优化器的选择等多个方面。合理地运用基于`ROWNUM`的分页查询方法及其优化技巧,可以显著提升系统的性能表现和用户体验。

    ssh+oracle分页

    总结来说,“ssh+oracle分页”涉及了SSH框架整合、数据库操作、前端展示等多个环节,需要综合运用各种技术和工具,确保数据分页的高效性和用户体验。理解并掌握这些知识点,对提升Java Web开发者的能力大有裨益。

    JAVA_JDBC面向对象分页(初步设计二之oracle)

    总结来说,面向对象的Java JDBC分页查询涉及到创建Page类来存储分页信息,构造Oracle兼容的SQL语句,以及使用PreparedStatement执行查询。在实际开发中,我们还需要关注性能优化、异常处理和代码的可维护性,确保...

    Oracle的分页查询详解及效率.doc

    总结来说,Oracle的分页查询涉及到ROWNUM伪列的使用和优化策略的选择。理解这两种方法的效率差异以及何时使用HINTs来指导优化器,对于编写高效、性能优良的分页查询至关重要。在设计数据库查询时,考虑到这些因素...

    Oracle&JSP分页和Oracle分页

    总结来说,Oracle和JSP结合实现分页涉及以下几个步骤:在Oracle中构造分页查询,使用JDBC在Servlet中执行查询,然后在JSP页面中展示数据。理解并熟练掌握这些步骤对于开发高效、用户友好的数据驱动网站至关重要。在...

    Oracle 3种分页SQL方法比较

    这种方法既支持ORDER BY,又避免了全表扫描和子查询,因此在大数据量分页时可能更为高效。 总结来说,ROWNUM是最基础的分页方式,适合小数据量或无需排序的情况;ROWNUM结合子查询能保证有序分页,但效率较低;...

    oracle分页程序的实现

    Oracle数据库在处理大量数据时,为了提高...根据实际场景选择合适的方法,同时注意优化查询以提高性能,是确保高效分页的关键。在Eclipse这样的开发环境中,可以通过编写和运行SQL语句来验证和调试这些分页查询的实现。

    通用ORACLE存储过程实现分页和查询

    总结来说,Oracle存储过程实现分页查询的关键在于动态构造SQL语句,结合ROWNUM或ROW_NUMBER()来实现分页。理解这一机制有助于我们在处理大量数据时编写高效、可复用的代码。在实际应用中,根据具体需求和数据库设计...

    Oracle分页查询

    为了更高效地实现分页查询,有两种不同的写法可以考虑: 1. **第一种写法**: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) WHERE RN &gt;= 21 ``` 2....

    sturts+oracle+jdbc实现分页

    在IT行业中,数据库管理和数据检索是至关重要的环节,...通过编写Action类处理请求,利用Oracle的ROWNUM进行分页查询,并通过JDBC接口与数据库交互,最后通过分页模型类管理和展示数据,从而实现高效、易用的分页功能。

    Oracle分页

    总结,Oracle分页结合Servlet、AJAX、JSON和jQuery可以构建出高性能、用户体验良好的分页应用。Servlet处理后端逻辑和数据交互,AJAX实现前后端无刷新通信,JSON作为数据交换格式,而jQuery则负责前端的数据解析和...

    Oracle 分页的存储过程

    总结来说,Oracle分页存储过程是通过动态构造SQL语句,结合输入的分页参数,计算出总页数,并返回指定页的数据。这种方式在处理大量数据时提高了效率,同时也提供了灵活的查询控制。通过包装这些逻辑在存储过程中,...

    使用简单的SQL语句实现的Oracle数据库分页技术

    在Oracle数据库中实现分页查询是一项常见的需求,尤其是在处理大量数据时。本文将介绍一种利用简单SQL语句来实现Oracle数据库分页的方法,这种方法不依赖于复杂的PL/SQL过程或函数,而是通过SQL查询的巧妙设计来达到...

    Oracle分页详解

    本文将详细介绍如何在Oracle数据库中实现高效、灵活的分页功能。 #### 一、Oracle分页原理 Oracle中的分页主要通过`ROWNUM`伪列来实现。`ROWNUM`为每一行分配一个唯一的编号,起始值为1。通过限制`ROWNUM`的范围,...

    PB 做的分页查询24行一页

    对于想要学习如何在PB环境中处理大量数据并实现高效分页的开发者来说,这是一个有价值的参考资料。如果你没有数据库的表结构,可以自己根据需求创建相应的表并填充数据,以便更好地理解和应用这个Demo。

    oracle分页,比较简单很好懂

    Oracle数据库在处理大数据量时,分页查询是一个非常重要的功能,它可以帮助用户高效地浏览和检索数据,而无需一次性加载所有结果。Oracle提供多种方法来实现分页,这些方法各有优缺点,适用于不同的场景。本篇文章将...

    解析函数高效实现分页

    - 对于需要高效分页查询的应用,推荐使用`ROW_NUMBER()`函数。 通过以上分析和示例,我们可以看到,在Oracle数据库中利用`ROW_NUMBER()`函数实现分页是一种既简洁又高效的解决方案。它不仅解决了传统分页方法中...

    Oracle,SQl,MySql实现分页查询

    ### Oracle、SQL、MySQL 实现分页查询方法详解 在数据库操作中,分页查询是一项非常重要的技术,尤其是在处理大量数据时。本文将基于提供的文件信息,深入探讨三种不同的分页查询方法及其在Oracle、SQL Server...

    struts2.0 + hibernate + oracle 分页问题

    总结来说,Struts2.0处理HTTP请求,Hibernate管理数据持久化,而Oracle提供高效的数据存储和查询能力。在处理分页问题时,需要巧妙地结合这三个组件,合理设计和实现分页逻辑,以提高系统的响应速度和用户体验。通过...

Global site tag (gtag.js) - Google Analytics