`
heavenslv
  • 浏览: 81160 次
  • 性别: 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分页(limit方式的运用)Oracle分页(limit方式的运用)

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

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

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

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

    Oracle分页查询性能优化代码详解

    对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情况下,他们只看前几页。 通常有以下...

    Oracle分页查询的实例详解

    Oracle分页查询的实例详解 1.Oracle分页查询: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM tab) A WHERE ROWNUM &lt;= 40 ) WHERE RN &gt;= 21; 这个分页比下面的执行时间少,效率高。  2. ...

    Oracle分页技术

    Oracle分页技术,这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。

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

    基于Oracle作为后台数据库,在分析普通的查询方式后,提出了一种新的优化查询方法——索引扫描分页技术,通过试验分析,优化后的查询方法在实现分页显示的操作中有明显的提高。

    ORACLE9i_优化设计与系统调整

    §14.7.3 基于规则或基于代价优化方法 180 §14.8 优化连接* 181 §14.8.1 嵌套连接- 181 §14.8.2 合并连接- 183 第15章 使用优化器提示 183 §15.1 提示(Hint)概念 184 §15.1.1 提示的指定 184 §15.2 使用提示...

    [Oracle.DBA手记_数据库诊断案例与性能优化实践].《Oracle.DBA手记》编委会.扫描版

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle DBA 手记 数据库诊断案例与性能优化实践 3/3

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及Oracle典型错误的分析和诊断,各种SQL优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle.DBA手记1--数据库诊断案例与性能优化实践

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle.DBA手记_数据库诊断案例与性能优化实践

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle DBA 手记 数据库诊断案例与性能优化实践 1/3

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及Oracle典型错误的分析和诊断,各种SQL优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle DBA 手记 数据库诊断案例与性能优化实践 2/3

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及Oracle典型错误的分析和诊断,各种SQL优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    Oracle DBA手记:数据库诊断案例与性能优化实践

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    《Oracle DBA手记——数据库诊断案例与性能优化实践》第一章 to be continued

    ├─第一篇 DBA工作手记 │ 01.Eygle的DBA工作手记 │ 02.Yangtingkun的DBA工作手记 │ 03.老熊的DBA手记 │ 04.BanPing的DBA工作手记 │ ├─第二篇 诊断案例篇 ...表碎片及分页查询优化 05.一次排序的调整与优化

    Oracle_DBA手记1-数据库诊断案例与性能优化实践

    本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行...

    oracle学习资料收集

    Oracle分页和联表 存储过程 Oracle查询优化.pdf Oralce函数.doc 如何优化Oracle数据库保持优良性能.txt 深圳-华为Oracle数据库基础知识 ISSUE1.0.doc oracle补充.txt Oracle数据库优化之数据库磁盘IO.doc Oracle...

    ORACLE学习资料大全(存过,索引,函数,优化,分页,联表,游标,基础sql)

    ORACLE学习资料大全(存过,索引,函数,优化,分页,联表,游标,基础sql)

Global site tag (gtag.js) - Google Analytics