精华内容
下载资源
问答
  • oracle分页查询sql

    2019-01-15 23:03:22
    oracle分页查询语句sql
  • oracle分页sql

    2019-03-12 14:47:23
    SELECT * FROM ( SELECT * FROM ( SELECT row_number() OVER (ORDER BY t1.OBJECTID) AS sort, t1.* FROM T_SJCZRZ t1 WHERE t1.OBJECTID BETWEEN 100 AND 600 ) t2 WHERE t2.sort &...
    SELECT *
    FROM (
    	SELECT *
    	FROM (
    		SELECT row_number() OVER (ORDER BY t1.OBJECTID) AS sort, t1.*
    		FROM T_SJCZRZ t1
    		WHERE t1.OBJECTID BETWEEN 100 AND 600
    	) t2
    	WHERE t2.sort < 10 * 2
    )  where sort > 10*(2-1);

    参考https://www.cnblogs.com/jay763190097/p/6813792.html

    结果:

    展开全文
  • ORACLE 分页SQL

    2017-09-27 15:53:53
    ORACLE 分页SQL 这个sql的分页很简单,但是由于十分常用,且通常用于查询大量数据的情况。 SELECT * FROM(  SELECT A.*,ROWNUM RN  FROM   (SELECT * FROM TABLE_XX ) A  WHERE ROWNUM ) TL  WHERE ...
     
    
    这个sql的分页很简单,但是由于十分常用,且通常用于查询大量数据的情况。
    SELECT * FROM(
            SELECT A.*,ROWNUM RN
            FROM 
                        (SELECT * FROM TABLE_XX ) A
            WHERE ROWNUM<=20
    )  TL 
    WHERE RN >=11
     
    这个sql高效的原因在于优化模式下,
    Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
    故此查询中,查询条件WHERE ROWNUM<=20就可以被Oracle推入到内层查询中,
    这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询,将结果返回。
    展开全文
  • ORACLE分页查询SQL语句(最有效的分页)

    万次阅读 多人点赞 2018-11-01 16:18:24
    三、分析 Oracle分页查询语句基本上可以按照本文给出的格式来进行套用。 分页查询格式: SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT * FROM table_name) a WHERE ROWNUM ) WHERE rn >= 21 其中最内层的...

    一、效率高的写法

    1.无ORDER BY排序的写法。(效率最高)
    (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM emp t
    
             WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                 AND TO_DATE ('20060731', 'yyyymmdd')
    
               AND ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    2.有ORDER BY排序的写法。(效率较高)
    (经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT t.*
    
                        FROM emp t
    
                       WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                           AND TO_DATE ('20060731', 'yyyymmdd')
    
                    ORDER BY create_time DESC, emp_no) tt
    
             WHERE ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    二、效率垃圾但又似乎很常用的分页写法

    3.无ORDER BY排序的写法。(建议使用方法1代替)
    (此方法随着查询数据量的扩张,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060731', 'yyyymmdd')) table_alias
    
     WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;
    
    --TABLE_ALIAS.ROWNO  between 10 and 100;
    

    4.有ORDER BY排序的写法.(建议使用方法2代替)
    (此方法随着查询范围的扩大,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt) table_alias
    
     WHERE table_alias.rowno BETWEEN 10 AND 20;
    

    5.另类语法。(有ORDER BY写法)
    (语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。)

    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, tt.*
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt
    
             WHERE ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    
     
    
    --6另类语法 。(无ORDER BY写法)
    
    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060531', 'yyyymmdd')
    
               AND ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    

    三、分析

    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 *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a
    
             WHERE ROWNUM <= 40)
    
     WHERE rn >= 21
    
    展开全文
  • oracle数据里向外迁移大量数据,有多种方法。其中一种就是应用jdbc连接oracle,写代码向外分页提取。

    从oracle数据里向外迁移大量数据,有多种方法。其中一种就是应用jdbc连接oracle,写代码向外分页提取。我现在工作的一个任务就是从oracle中单表数据提取出来,进行单行数据加工转换,然后再写入mysql中。我所用的工具是spring batch。原来的方案是通过生成sql语句,直接导入mysql中,但是这个数据转换业务太复杂,所以就采用了前面的方案。

    spring batch 对于数据进行批处理,主要分三步:

    1. 从源库oracle 中读取数据(ItemReader);
    2. 对于读取数据进行处理(ItemProcessor);
    3. 处理结果写入目标库mysql (ItemWriter);

    本文不讲如何应用spring batch 的具体步骤,只讲如何在oracle中如何进行分页提取。从oracle中读取数据,如果数据量不大,我们可以一次性直接取出,然后根据业务规则处理后续步骤。但是当数据量大到一定程度,就不能一次取出那么多数据,不然后果自负。那么如何进行分而获取呢?
    之前所用的sql分页语句(方案A):

        select * from (
            select rownum rownum_,t1.* FROM 
                (我的查询语句) 
                  t1 
      ) t2 where t2.rownum_>? and t2.rownum_ <=?

    一直也没有太在意它的好与坏。但是这次导数据,被始的时候从oracle中提取数据很快,可是越到后面提取的时间越长。这让我不得其解,所以就怀疑这个sql的性能。后来将其改为(方案B):

    select * from (
                    select rownum rownum_,t1.* FROM  (
                            我的查询语句
                            )  t1 where rownum<=? 
        ) t2 where t2.rownum_>? 

    速度就上去,方案B的性能好与方案A,所以大家不要用方案A,要采用方案B。
    那么这篇文档,就这样结束了有点对不起标题--深入理解。这根本就不深入吗?那么如何才算深入呢?搞清楚方案B为什么比方案A高效,这样才算深入。其实这个问题,ThomasKyte 已经解释过了,在一本叫《oracle高效设计》中第8章第3节: 用ROWNUM标记页号。但是这样书目前来看已失传了,原因是它老了讲oracle 8版本的。还有年代久远,tom也不再出新版了,所以被遗忘了。刚才我在百度上还能搜索到这本书的下载链接,所以有兴趣的朋友可以下载看一下。

    小插曲:
    背景:关于这本书是没得买了,我不太爱看电子书,大约2年前就把第8章、第9章打印出来了,看了之后也没有装订,就散放在书架上的。
    现在:我也是偶然间看到这个解决方案的,之前因为程序出现性能问题,很郁闷的下班回家,路上一起在思考这个问题,如何才能解决它的性能呢?可是回到家吃过了晚饭,关于这个问题也没有找到答案。家里有一个2岁的熊孩子,只要见到笔,那就要纸(之前我跟我妈说了,纸给他玩没事,书就别给他涂了),然后他的作品就这样产生了,纸散落的到处都是。吃过饭了,帮他收拾烂摊子的时候,偶然捡到这张A4纸正好是关于ROWNUM的,于是就细细的再读读这一段,第二天改了代码一切都ok了。所以家里有个熊孩子或萌娃子也不错,他会把你所有的所有的东西都会帮你找出来晒晒,哈哈!谢谢熊孩子!

    展开全文
  • MySQL分页 Oracle分页 SQL Server分页 MySQL,ORACLE,SQL SERVER 分页查询语句 一、MySQL SELECT * FROM table_name LIMIT 0,5 ; 二、ORACLE SELECT * FROM ( SELECT t.* , rownum r FROM table_name...
  • Oracle分页Sql

    千次阅读 2012-03-22 00:17:44
    1.根据ROWID来分 select * from t_xiaoxi where rowid in(select rid from (select rownum rn,ridfrom(select rowid rid,cid from t_xiaoxi order by cid desc) where rownum9980)order by cid desc;...
  • 1、分页sql写法: 2、疑问: 为什么不写成这样: select T.* ,ROWNUM RN from tableName T where ROWNUM <=${pageNumber}*${pageSize} andROWNUM >(${pageNumber}-1)*${pageSize} 这样写是永远查不出...
  • oracle分页sql语句

    2016-07-14 21:15:12
    oracle分页与mysql的分页是不一样的,mysql的分页网上很好找,但oracle的难找一些。下面就直接上代码了,参照这个格式就可以了。 select distinct code,dates,status from (select t1.*,rownum rn from(select * ...
  • Oracle分页查询sql语句

    千次阅读 2019-07-18 16:09:48
    Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点,Oracle中分页使用rownum ,相对复杂一点。 sql语句如下: SELECT * FROM ( SELECT t.*, rownum rn FROM ( SELECT * ...
  • 一个分页语句引发的思考执行计划显示耗时是2.491秒,这是Oracle预估时间,实际在PL/SQL中的执行时间是大于20s。2.优化分析过程全表查询单列进行排序与对全列进行排序的效率对比运用单列排序分页3.Rownum和Rowid的...
  • Oracle分页SQL

    千次阅读 2015-01-20 02:19:15
    Oracle 分页功能的实现
  • ORACLE SQL_分页查询

    千次阅读 2019-04-16 11:11:31
    ORACLE SQL _分页查询 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:Oracle sql * plus PLSQL Developer 作者:叶 撰写时间:2019年01月01日 ~~~~~~~...
  • 主要介绍了Oracle分页查询性能优化代码详解,简述了进行分页查询性能优化的原因,具有一定参考价值,需要的朋友可以了解下。
  • –①之所以oracle需要三层嵌套来实现分页原因如下: – 因为在查询的时候,order by 的执行是在 select 之后的, – 所以如果在第一层查询中查出ROWNUM,再按某一字段排序后, –会导致查出得到的ROWNUM值顺序...
  • Oracle SQL实现分页查询

    2018-11-15 16:54:57
    Oracle SQL分页查询 1、表结构 SQL&amp;gt; desc test; 名称 是否为空? 类型 --------------------- -------- --------------- ID NOT NULL NUMBER(8) USERNAME ...
  • oracle数据库分页sql

    2020-06-16 12:09:35
    oracle分页 当前页码pageNo 每页显示数目pageSize last=page-no 乘以 page-size first=(page-no-1)乘以 page-size) SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT * FROM table_name) a WHERE ROWNUM...
  • 这是一个已经封装好的分页,拿来就可以用,具体细节参考说明。觉得不错要分享啊
  • oracle分页Sql

    2012-02-29 17:18:05
    Oracle分页查询语句基本上可以按照本文给出的格式来进行套用。 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) WHERE RN >= 21 ...
  • Oracle分页SQL,3种分页SQL方法比较
  • mysql,oracle,sql server分页总结与比较
  • oracle九百万级的分页sql优化

    千次阅读 2018-03-15 10:25:58
    先看看数据库music表的大小...优化之前的sql: select * from (SELECT m.* ,ROWNUM rn from music m) m where m.rn&gt;0 and m.rn&lt;=20 执行结果: [SQL]select * from (SELECT m.* ,ROWNUM rn from m...
  • ORACLE分页查询效率

    2008-07-18 14:41:26
    ORACLE分页查询效率
  • 最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习….. (一)、mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: ...
  • oracle 分页 很棒的实现方法,大家可以分析下。
  • 在最近的项目中,有一张表储存了大约一万多条记录,在进行分页查询时出现了重复的数据。 SQL语句是这样的 select * from( select a.*,rownum rn from ( select * from order by t.create_time ) a where <...
  • ORACLE SQL 分页查询

    2019-04-05 21:50:26
    有时候我们想对数据访问的控制或者查询一部分数据的时候,这时我们可以用分页查询数据,在一定程度上提高了查询的速度,或者说简化查询,那么我们在ORACLE里面怎么实现分页查询呢?下面是实现分页查询的两种方法; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,151
精华内容 21,260
关键字:

oracle分页sql