`
xuyongping
  • 浏览: 123568 次
  • 性别: Icon_minigender_1
  • 来自: 部落格
社区版块
存档分类
最新评论

Oracle rowid 优化分页

阅读更多
今天看到一个分享,了解到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 RowID实现批量数据的分页下载.pdf

    在Oracle数据库中,批量数据的分页下载是一个重要的优化策略,尤其当处理大量数据时,直接一次性下载所有数据可能会导致性能问题,甚至阻塞数据库。本文重点探讨了一种基于Oracle RowID实现批量数据分页下载的方法,...

    oracle的分页查询

    Oracle 的分页查询 在 Oracle 中,分页查询是非常常见的需求,但是在使用查询条件时又不能使用大于号(&gt;)。本文将讲解 Oracle 中的分页查询,包括使用 ROWNUM 伪列和 ORDER BY 子句对查询结果进行排序和分页。 一...

    oracle的伪列与分页

    综上所述,Oracle伪列如ROWID和ROWNUM在实际应用中发挥着重要作用,不仅可以帮助优化查询性能,还能轻松实现复杂的分页功能。同时,通过Java JDBC编程,可以进一步提升应用程序与Oracle数据库的集成度和灵活性。

    oracle分页程序的实现

    Oracle数据库在处理大量数据时,为了提高查询效率和用户体验,常常需要使用分页查询。分页不仅能够有效地减少网络传输的数据量,还能让用户逐步浏览数据,提高网页加载速度。以下将详细介绍Oracle数据库中实现分页...

    oracle分页查询

    在Oracle数据库中,分页查询是一项非常常见的操作,特别是在处理大量数据时,为了提高用户体验,通常需要只显示一部分数据,而不是一次性加载所有记录。本文将详细介绍Oracle中的分页查询原理及其实现方法。 首先,...

    对Oracle数据库三种分页方法的测试与研究.pdf

    本文主要探讨了Oracle数据库中的三种分页方法:基于ROWNUM的分页、基于ROW_NUMBER()解析函数的分页和基于ROWID的分页。首先,我们创建了一个名为stu的测试表,包含学生的基本信息,如学号、考试号、姓名、专业、考试...

    数据库分页优化技术分析与实现

    在介绍数据库分页优化技术时,首先应当明确传统分页查询方法所存在的问题。在传统方法中,分页查询通常采用(limit, offset)方式,但这种方式随着数据量的增长及翻页数量的增加,查询效率会显著降低。尤其在数据量较...

    myeclise+oracle分页

    3. **DBMS_ROWID**:Oracle 9i引入了DBMS_ROWID包,可以用来获取每行的唯一行标识,辅助进行分页。 4. **Oracle 12c的FETCH FIRST/SKIP语法**:Oracle 12c引入了标准的SQL分页语法,更接近于其他数据库的分页方式。...

    Oracle优化器模式与Oracle索引优化规则.pptx

    Oracle数据库在处理SQL查询时,会使用一种称为优化器的组件来决定最有效的执行计划。优化器有两种主要的模式:基于规则的优化(RBO)和基于代价的优化(CBO)。RBO按照预设的规则来选择执行路径,如在WHERE子句中...

    oracle_SQL中rowid与rownum的使用

    在Oracle SQL中,`ROWID`和`ROWNUM`是两个非常重要的概念,它们在数据库查询和数据操作中起着至关重要的作用。本文将详细探讨这两个特性,包括它们的定义、用途以及如何在实际场景中有效利用它们。 一、ROWID详解 `...

    rowid与rownumber

    rowid 和 rownum 是 Oracle 数据库中的两个重要概念,对于数据库开发人员来说非常重要。下面我们将详细介绍 rowid 和 rownum 的概念、结构、应用场景等。 一、rowid 概念 rowid 是 Oracle 数据库中的一个虚列,...

    oracle_SQL-rowid--rownum.zip_oracle

    在Oracle SQL中,`ROWID`和`ROWNUM`是两个非常重要的概念,它们在数据库查询和操作中扮演着关键角色。本篇文章将详细解析这两个概念及其应用。 **ROWID** `ROWID`是Oracle数据库中一个特殊的伪列,它为每一行数据...

    Oracle中实现MySql中limit+SqlServer分页+分页的存储过程

    本篇文章将探讨如何在Oracle数据库中实现类似MySQL的`LIMIT`分页功能,以及如何模拟SQL Server的分页方式,并介绍`INTERSECT`和`MINUS`这两个SQL运算符。 首先,`INTERSECT`运算符用于找出两个或多个查询结果中的...

    数据库分页查询整理(oracle、mysql、SqlServer、access、db2等)

    数据库分页查询整理 数据库分页查询是指从大量数据中提取特定范围的数据,以便于...不同的数据库管理系统(DBMS)有不同的分页查询语句,这些语句都可以根据实际情况进行修改和优化,以提高查询效率和数据处理效率。

    在oracle中灵活使用Rownum和rowId

    ### 在Oracle中灵活使用Rownum和RowId 在Oracle数据库中,`ROWNUM` 和 `ROWID` 是两个非常重要的概念,它们可以帮助我们在查询数据时实现更灵活的数据管理。本文将详细介绍这两个概念的区别及其使用方法,并通过...

    Oracle分页技术

    总之,Oracle分页技术是数据库管理中的重要工具,它结合了ROWNUM、嵌套查询和优化策略来有效地处理大数据量的查询。理解这些概念和技巧对于编写高效的分页查询至关重要,特别是在处理用户交互式应用时,能够提供快速...

    分页的sql总结

    在众多的SQL操作中,分页查询是数据库管理员和开发人员频繁使用的场景之一,尤其是在处理大量数据时,有效地进行分页不仅能够提升查询性能,还能优化用户体验。以下是对分页SQL查询技术的深入解析,旨在帮助读者理解...

    Oracle,mysql,sqlserver等各种数据库的分页方法

    本文将详细介绍Oracle、MySQL、SQL Server等常见数据库系统的分页方法。 ### MySQL分页方法 #### 1. 使用`LIMIT`子句 MySQL提供了`LIMIT`子句来实现分页查询。该子句可以接受两个参数:第一个参数为起始行号...

    ORACLE9i_优化设计与系统调整

    第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...

Global site tag (gtag.js) - Google Analytics