zoukankan      html  css  js  c++  java
  • 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后

  • 相关阅读:
    进程、线程
    timer控件、三级联动
    用户控件、动态创建添加
    打印控件
    窗体移动和阴影,对话框控件
    winform listview控件
    winform打开唯一窗体、构造函数传值
    菜单和工具栏
    winform公共控件
    hibernate中各种包的添加
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10748613.html
Copyright © 2011-2022 走看看