oralce 的rownum 和rowid 学习

1.概念

  rowid和rownum都是伪列实际上这一列本身在数据字典中并不存在,在查询结果输出时它被构造出来的);

 

 1)rownum是基于查询结果的顺序标记,而且是逐次递加的,换句话说就是只要有rownum=1的记录,才可能有rownum=2的记录

 

 2)rowid是用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

 

   有受限的(orace8g以前)和 扩展的(oracle8g之后)两种形式,

   受限的rowid:

      文件编号(10bit) + 块编号(22bit) + 行编号(16bit) ,6个字节的存储空间

   扩展的rowid:

    数据对象编号(32bit) + 文件编号(10bit) + 块编号(22bit) + 行编号(16bit) ,10个字节的存储空间

 

   rowid是base64编码的,用A~Z a~z 0~9 + /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63可以将其看做一个64进制的数。

   扩展的rowid也完全兼容受限的rowid   

   

  对rowid分析比较好的一些链接

    http://space.itpub.net/?uid-25744374-action-viewspace-itemid-729897

    http://www.cuug.com/xueyuanzhuanqu/jishuwenzhang/201110/jishuwenzhang-1147.html

2.实战

  1)rownum在分页,查询中用到较多

        where之后也只能rownum=1或<=n

  2)rowid 在删除重复记录时

    DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO) ,而且比较高效;通过rowid快速定位到某记录,。。。

      也可以通过dbms_rowid这个包得到rowid的详细信息;

       还有rowid的一些函数ROWIDTOCHARROWIDTONCHAR,CHARTOROWID结合实际使用

 

        感受:之前对rowid有过了解,当并未深入;遇到时也只是以解决实际问题为主,但发现那并不是一个好的做法,而且之后对它也只是个懵懂的感觉,查一些资料当时会理解但还是会忘。感觉还是写下来比较好,也是个熟悉,总结的过程。实际的工作开发中并没有这样及时总结和学习的一种习惯,渐渐发现这并非明智之举,一些东西总得沉淀一下,要不永远不是自己的。

        上面一点小感,希望跟大家有所共鸣。

 

 

 

 

你可能感兴趣的:(rownum)