oracle分页优化 ---- rowid方法
2011-04-08 10:07
501 查看
了解到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后
假设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进行order by,排序字段值相同时,导致分页数据出现相同,加入rowid的解决方法
- [Oracle] Sql 优化系列--查看Oracle执行计划的方法
- Ajax无刷新分页的性能优化方法
- 解析Oracle数据扫描 Oracle SQL查询优化 引导局部范围数据扫描的方法(2)
- Oracle SQL语句之常见优化方法总结
- 九大Oracle性能优化基本方法详解(转)
- SQL的优化方法(oracle)
- 关于oracle性能优化的方法
- Oracle监听器被优化大师挂掉后的完美解决方法
- oracle count 百万级 分页查询记要总数、总条数优化
- mysql limit分页优化方法
- 【转】大数据量下,分页查询优化方法解释
- Oracle库表设计的优化方法
- 优化分页系统的一种方法
- ORACLE数据库SQL优化--->Oracle表连接方法
- oracle实例的内存(SGA和PGA)调整,优化之原理和方法
- mysql limit分页优化方法分享
- oracle 优化方法
- 【Oracle】——大数据下分页方法
- Ajax无刷新分页可以尝试的性能优化方法