zoukankan      html  css  js  c++  java
  • ORACLE分页查询

    通用oracle有三种方法来实现分页查询,通过各ROWNUM、ROWID、或分析功能的实现。这将是测试表USER_INFO案件,简要实现三大种分页:

    -- Create table
    create table USER_INFO
    (
      USER_ID      NUMBER(12) not null,
      NAME         VARCHAR2(30),
      PET_NAME     VARCHAR2(30),
      HEAD_ICO     VARCHAR2(255),
      CREATE_DATE  DATE not null
    )
    1.依据ROWNUM分页

    SELECT TT.*
      FROM (SELECT ROWNUM RN, T.*
              FROM (SELECT UI.USER_ID,
                           UI.NAME,
                           UI.PET_NAME,
                           UI.HEAD_ICO,
                           UI.CREATE_DATE
                      FROM USER_INFO UI
                     ORDER BY UI.CREATE_DATE DESC) T
             WHERE ROWNUM < 600010) TT
     WHERE TT.RN >= 600000;
    <span style="color:#ff0000;">--运行时间:1.981秒</span>

    2.依据ROWID分页

    SELECT UI.USER_ID, UI.NAME, UI.PET_NAME, UI.HEAD_ICO, UI.CREATE_DATE
      FROM USER_INFO UI
     WHERE ROWID IN (SELECT RID
                       FROM (SELECT ROWNUM RN, RID
                               FROM (SELECT ROWID RID
                                       FROM USER_INFO 
                                      ORDER BY CREATE_DATE DESC)
                              WHERE ROWNUM < 600010)
                      WHERE RN >= 600000)
     ORDER BY UI.CREATE_DATE DESC;
    <span style="color:#ff0000;"> --运行时间:1.887秒</span>

    3.依据分析函数分页

    SELECT *
      FROM (SELECT UI.USER_ID,
                   UI.NAME,
                   UI.PET_NAME,
                   UI.HEAD_ICO,
                   UI.CREATE_DATE,
                   ROW_NUMBER() OVER(ORDER BY UI.CREATE_DATE DESC) RK
              FROM USER_INFO UI) T
     WHERE T.RK < 600010
       AND T.RK >= 600000
    <span style="color:#ff0000;">--运行时间:2.886秒</span>

    从上述三个sql的我们能够发现:

    (1) 不管用那种方式实现分页,都是要用到嵌套子查询的;

    (2)查询所需字段是一般建议一一列出所需字段,而不是通过select * 的方式所有查出。这样会影响查询效率。

    (3)採用ROWID分页查询效率相对较高,ROWNUM和分析函数分别次之。当然,对于数据量非常大的表。可能只通过上述方式是非常慢满足性能需求的。还需通过优化SQL或方法的完整索引。


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    SQL注入之Sqli-labs系列第八篇(基于布尔盲注的注入)
    数据宽度
    进制
    cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案
    kali linux Python 黑客编程1 开发环境初始化
    selenium之元素定位-xpath
    Python+Selenium基础入门及实践
    任意用户密码重置的10种姿势(看视频记的笔记)
    Python—requests模块详解
    Ubantu16.04 改root用户登陆
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4657036.html
Copyright © 2011-2022 走看看