`
heavenslv
  • 浏览: 82397 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle的分页方法优化

阅读更多

今天看到一个分享,了解到DBA对oracle的分页方法进行优化,所以补充一个加强版!

假设activity_pepsi_dream表拥有 id, nick, auction_url, gmt_create 字段。

 

--普通写法(显示1-50页)

select id, nick, auction_url, gmt_create
from (select id, nick, auction_url, gmt_create, rownum linenum
          from (select id, nick, auction_url, gmt_create
                  from activity_pepsi_dream t
                 where status = 0
                 order by t.GMT_CREATE desc) r
         WHERE rownum <= 50)
WHERE linenum >= 1


--rowid写法


select                                                  /*+ordered use_nl(t1,t2)*/

       t2.id,
       t2.nick,
       t2.auction_url,
       t2.gmt_create 
from (select rid
          from (select r.rid, rownum linenum
                  from (select                    /*+ index(t,ind_pepst_dream_status_create) */
                         rowid rid
                          from activity_pepsi_dream t
                         where status = 0
                         order by t.GMT_CREATE desc) r
                 WHERE rownum <= 50)
         WHERE linenum >=1) t1,
       activity_pepsi_dream t2
where t1.rid = t2.rowid

性能比较:

---查询第一页普通写法要比rowid写法要快

---随着翻页次数的增多,普通写法需要回表的记录越来越多,性能下降很快。比如你要看200-250条的记录,这时候普通写法需要回表250条记录,而rowid写法只要会标200-250区间中的这50条记录

 

 

rowid 写法优化的情况:

--第一层必须都在索引中扫描,不回表

--第二三层找到满足条件的rowid

 

--最后根据rowid去回表找到记录

总结:关键就是oracle 的 rowid 属性可以最快速度的寻找到该行的数据,并且固定,不需要回表操作。

reference :http://tolywang.itpub.net/post/48/22612

1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。 2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。 
3、利用rowid是访问表中一行的最快方式。 
4、rowid需要10个字节来存储,显示为18位的字符串。 
rowid的组成结构为: 
data object number(6位字符串)+relative file number(3位字符串)+block number(6位字符串)+row number(3位字符串),如:AAAADeAABAAAAZSAAA 
5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息: 
bossdb-SQL>select 
2 rowid, 
3 dbms_rowid.rowid_object(rowid) obj_id, 
4 dbms_rowid.rowid_relative_fno(rowid) df#, 
5 dbms_rowid.rowid_block_number(rowid) blknum, 
6 dbms_rowid.rowid_row_number(rowid) rowno 
7 from p_test where rownum<5; 
ROWID OBJ_ID DF# BLKNUM ROWNO 
------------------ ---------- ---------- ---------- ---------- 
AAAQ+tAANAAAC6SAAA 69549 13 11922 0 AAAQ+tAANAAAC6SAAB 69549 13 11922 1 AAAQ+tAANAAAC6SAAC 69549 13 11922 2 AAAQ+tAANAAAC6SAAD 69549 13 11922 3 
我们可以看到,通过rowid_row_number得到的行号是从0开始的,这是和rownum伪列的一个不同之处。我猜测rowid_row_number在求行号的时候是计算首行的偏移量。

一般来说,当表中的行确定后,rowid就不会发生变化。
但当如下情况发生时,rowid将发生改变: 
1、对一个表做表空间的移动后 
2、对一个表进行了EXP/IMP后

分享到:
评论

相关推荐

    Oracle分页(limit方式的运用)

    #### 四、Oracle分页的优化技巧 1. **避免全表扫描**:尽可能使用索引来限制查询的范围,减少不必要的数据读取。 2. **使用索引优化排序**:如果查询中涉及到排序操作,确保相关的字段已经建立了索引,这样可以显著...

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

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

    oracle分页查询sql

    ### Oracle分页查询详解 #### 一、分页查询的重要性 在数据库操作中,分页查询是一项非常重要的技术。尤其当处理大量数据时,一次性获取所有数据不仅会消耗大量的网络带宽,还可能导致前端页面加载缓慢,用户体验...

    ORACLE分页查询效率

    根据所提供的信息,我们可以提炼出以下关于“ORACLE分页查询效率”的相关知识点: ### 一、Oracle中的分页查询 #### 1.1 分页查询的重要性 - **背景介绍**:在实际应用中,数据库查询结果往往非常庞大,一次性加载...

    Oracle 分页实例 带分页控件用法

    在这个Oracle分页实例中,我们将探讨如何结合分页控件实现数据的分页显示。 首先,我们看到一个名为`webdiyer:AspNetPager`的控件,这是一个ASP.NET的Web分页控件。这个控件包含了几个关键属性: 1. `PageSize`:...

    oracle 分页类文件

    `ShowSQL.java`可能会包含生成这类复杂SQL的静态方法,接收页码和每页记录数作为输入,返回符合Oracle语法的分页SQL。同时,为了提高性能,可能还会涉及优化SQL,比如使用索引来加速查询。 在实际使用中,开发者...

    oracle 分页完整代码

    同时,对于大数据量的场景,还可以考虑使用Oracle的分页功能,如RANGE BETWEEN或者Oracle 12c引入的FETCH FIRST子句,这些方法可以更高效地处理分页。 此外,对于Java应用,可以使用ORM框架如Hibernate或MyBatis来...

    Oracle&JSP分页和Oracle分页

    另一种更高效的方法是使用Oracle的`ROW_NUMBER()`函数,配合`OVER()`子句,这样可以实现更复杂的分页逻辑。比如,如果我们要查询第5页的数据,每页20条,可以这样写: ```sql SELECT * FROM ( SELECT ROW_NUMBER()...

    oracle分页查询并返回总记录数据存储过程

    Oracle 数据库提供了多种方法来实现分页查询,其中使用存储过程是一种高效且灵活的方式。本文将详细介绍如何在 Oracle 中创建一个用于分页查询并返回总记录数的存储过程。 #### 核心概念 1. **存储过程**:存储在...

    Oracle分页

    然后,根据这些参数构建SQL查询语句,结合上面提到的Oracle分页方法,获取对应的数据。同时,Servlet可以处理请求和响应,将分页数据以特定格式(如JSON)返回给前端。 三、AJAX异步请求 AJAX(Asynchronous ...

    Oracle 10g数据库海量数据分页查询优化.pdf

    Oracle 10g 数据库海量数据分页查询优化 本文主要介绍 Oracle 10g 数据库中的一种优化的海量数据分页查询解决方案。该方案通过分析传统分页查询技术的不足,融合了多种技术,包括数据库优化策略、SQL 语句优化、...

    ssh+oracle分页

    在“ssh+oracle分页”这个主题中,我们将深入探讨如何利用这三个框架与Oracle数据库进行集成,并实现数据的分页显示。 1. **Struts框架**:Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。...

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

    本篇文章将详细探讨如何优化Oracle分页查询中的排序与效率问题。 #### 一、理解Oracle分页查询的基本原理 在Oracle中实现分页查询通常有两种方法:基于ROWNUM的方法和子查询方法。这里主要讨论的是基于ROWNUM的...

    Oracle的SQL分页实践

    本实践将深入探讨Oracle SQL分页的实现方法。 首先,我们要了解Oracle中的基本分页查询方式。在Oracle 9i及更高版本中,可以使用ROWNUM伪列进行分页。ROWNUM是在查询结果集生成时被赋予的数值,表示行的顺序。例如...

    oracle分页程序的实现

    以下将详细介绍Oracle数据库中实现分页查询的方法以及相关知识点。 在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的...

    Oracle 分页存储过程 终极版

    总的来说,"Oracle分页存储过程 终极版"是一个针对大数据量查询优化的解决方案,它通过高效的分页策略和存储过程封装,实现了快速、可控的分页查询,提升了用户体验并减轻了数据库的负载。在实际开发中,这样的工具...

    asp.net+oracle 分页

    Oracle支持ROWNUM伪列来进行分页,但这种方法在处理大数据量时效率较低。更好的方法是使用Oracle的"OFFSET-FETCH"语法,类似于SQL Server的"TOP-N"。例如: ``` SELECT * FROM (SELECT T.*, ROWNUM RN FROM ...

    oracle 分页语句

    - 一种优化方法是在使用`ROWNUM`之前,先对数据进行必要的过滤和排序操作,减少需要处理的行数。 - **索引利用**: - 如果查询条件中包含索引字段,则可以考虑建立相应的索引来加速查询过程。 - 对于大型表,...

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

    总的来说,Oracle的分页查询涉及到多个层面的优化策略,包括选择合适的分页方式、利用查询提示以及考虑联接方法。理解这些概念有助于编写更高效的分页查询语句,尤其在处理大数据量的场景中。在实际应用中,应根据...

    java web与Oracle数据的分页功能

    在Java Web开发中,与Oracle数据库进行交互时,分页功能是常见的需求,尤其是在处理大量数据时,为了提高用户体验和加载速度,分批次地显示数据是必不可少的。本项目提供的源代码正是针对这一需求,提供了在Java Web...

Global site tag (gtag.js) - Google Analytics