1 表里面的数据对应的rowid是怎么获得的? 是否越晚插进表的数据的rowid越大?2 假设有如下查询结果select max(rowid) as max, min(rowid) as min from a;
max         min
---------   ------------
BBB         AAA则select * from a where a.num > 1;与select * from a where rowid >= 'AAA' and rowid <= 'BBB' where a.num > 1;是否能查出同样结果?max函数对rowid进行比较的原则是什么?(即通过什么来判断两rowid谁大谁小)
3 rowid取值有什么规律,例如有没有固定长度是多少,组成字符(似乎只有大写和数字字符)
问题比较多,麻烦各位帮忙^_^

解决方案 »

  1.   

    网上查了一下,知道第一个问题答案了
    rowid不一定随数据插入而增大
      

  2.   

     2
    应该是同样的结果,
    rowid也是一个数字,64进制
    3
    rowid是基于base64编码,一共有18位,分为4部分:OOOOOOFFFBBBBBBRRR其中:OOOOOO: 六位表示data object id,根据object id可以确定segment。关于data object id和object id的区别,请参考http://www.orawh.com/index.php/archives/62FFF: 三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定datafile。关于相对文件号和绝对文件号,请参考http://blog.itpub.net/post/330/22749BBBBBB:六位表示data block number。这里的data block number是相对于datafile的编号,而不是相对于tablespace的编号。RRR:三位表示row number。
      

  3.   

    1,不一定
    2,rowid就是个80BIT的二进制数
    3,从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个变成了每个表空间不能超过1023个 数据文件
      

  4.   

    谢谢LS二位的回答,再请教多一个问题,不何网上许多人推荐不要使用select * from a where rowid >= 'AAA' 这样的形式,说是rowid一般不用来做比较的,不知是为何
      

  5.   

    rowid相关东西,wffffc 2楼说的很清楚。 rowid 只是一个伪列,没有业务意义,所以 where rowid >= 'AAA'是没有什么意义的,但是通过rowid访问数据是很快的。如果你知道了个一条记录的rowid用where rowid = 'AAA' 访问速度是最快的,即便你有一个主键,即AAA对应的主键字段是xxx 值=10,你用where xxx=10 都要先找到rowid,然后由rowid再去找到这条记录。