视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
rowid高速分页解析
2020-11-09 15:02:09 责编:小采
文档


--分页第一步 获取数据物理地址select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc;--分页第二步 取得最大页数select rownum rn, rid from (select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc) where rownum = 1

--分页第一步 获取数据物理地址
select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc;

--分页第二步 取得最大页数
select rownum rn, rid
 from (select t.rowid rid, t.lastdate
 from t_test t
 order by t.lastdate desc)
 where rownum <= 10;
 
 --分页第三步 取得最小页数
 select rn,rid
 from (select rownum rn, rid
 from (select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc)
 where rownum <= 10)
 where rn > 5;
 
 --分页第四步 再根据物理地址,查询出具体数据
 select t1.*,t1.rowid
 from t_test t1
 where t1.rowid in
 (select rid
 from (select rownum rn, rid
 from (select rowid rid, t.lastdate from t_test t order by t.lastdate desc)
 where rownum <= 10000)
 where rn > 5000); 

在8i以前rowid由file#+block#+row# 组成,占用6个bytes的空间,10 bit的file# ,22 bit 的block#,16 bit 的row#。

其中oracle的dba(data block address)是32 bits的,包括10 bit 的 file# 和 22 bit 的block#。

由于不存在0编号文件,oracle中的文件最大数量2^10-1=1023

而datafile能达到的最大size就是2^22*db_block_size

如果db_block_size为4k的datafile max size就是16G

如果db_block_size为8k的datafile max size就是32G

从oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间,

32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#.由于rowid的组成从file#变成了rfile#,

所以数据文件数的也从整个库不能超过1023个变成了每个data_object_id不能超过1023个数据文件。当然,你或许要问,

为什么oracle不调整rowid中表示 file# 的 bit数量,这个应该是由于兼容性的引起的,在 oracle7 的索引中存储的rowid

就是 file# + block# + row# ,因为这样处理后关于索引的存储,oracle8和oracle7没有发生变化。

虽然oracle使用了extend rowid,但是在普通索引里面依然存储了bytes的rowid,只有在global index中存储的是10bytes

的extend rowid,而extend rowid也是global index出现的一个必要条件。

1. rowid基本概念:
1) rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行

2) rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来

3) 利用rowid是访问表中一行的最快方式

4) rowid需要10个字节来存储,显示为18位的字符串。

2. 什么情况下rowid会发生变化
一般来说,当表中的行确定后,rowid就不会发生变化。 但当如下情况发生时,rowid将发生改变:

1) 对一个表做表空间的移动后

2) 对一个表进行了EXP/IMP后

下载本文
显示全文
专题