--分页第一步 获取数据物理地址
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后