• rowid快速分页解析


    版权声明:个人随笔,实用你就COPY,看不懂不解释 https://blog.csdn.net/HelloCqk1/article/details/36628787
    --分页第一步 获取数据物理地址
    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后

  • 相关阅读:
    基础才是重中之重~stream和byte[]的概念与转化
    微信扫码i支付~官方DEMO的坑
    知方可补不足~SqlServer自动备份数据库及清理备份文件
    11g r2 模拟OCR和voting disk不可用,完整恢复过程,以及一些注意事项
    自定义navigationBar的高度
    Python 中的用户自定义类型
    hdu1370-Biorhythms
    Ruby on Rails 實戰聖經阅读(三)
    重新配置与卸载 11gR2 Grid Infrastructure
    非确定有限状态自动机的构建(一)——NFA的定义和实现
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10748613.html
Copyright © 2020-2023  润新知