欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

rowid高速分页解析

程序员文章站 2022-03-15 22:48:29
...

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