精华内容
下载资源
问答
  • rowid

    2019-12-12 17:13:46
    ROWID的格式 rowid OOOOOO FFF BBBBBB RRR 说明 数据对象号 相对文件号 数据块号 行号 上述表格是Oracle 9i及以上版本数据库中的rowid格式: 6位对象号+3位相对文件号+6位数据...
    ROWID的格式
    rowidOOOOOOFFFBBBBBBRRR
    说明数据对象号相对文件号数据块号行号

    上述表格是Oracle 9i及以上版本数据库中的rowid格式:

    6位对象号+3位相对文件号+6位数据块号+3位行号,是一个18位的64进制值。这个18位的64进制值在数据库内却是以10个bytes合计80个bit的二进制数存放的,和我们直接看到的结果有所区别。

    这里的64进制和10进制的对应编码如下:

     

    其中, 6位的对象号在数据库中是用32位二进制来存放的,也就意味着一一个oracle数据库中最多可以有232个对象,即4G个对象; 3位的相对文件号在数据库中是用10位二进制来存放的,也就意味著-一个表空间中最多可以容纳210=1024去掉全0和全1个数据文件 ,

    即1022个数据文件; 6位的数据块号用22位二进制来存放的,也就意味着-个数据文件最多可以包含222=4M个数据块; 3位的行号在数据库中是用1 6位二进制来存放的,也就意味著一一个数据块上最多可以容纳21 6-65536行记录。

     

    对于大文件表空间下的rowid有如下特定的格式,这有别于小文件表空间下的rowid格式:

    000000BBBBBBBBBRRR

    即,6位的数据库对象号+9位的数据块号+3位的行号,同样也是以18位的64进制值来表示80位的二进制数。只不过,在这里少了相对文件号,其中6位的数据库对象号用32位的二进制数来存放(即-一个数据库最多可以拥有232=4G个数据块对象),9位的数据块号同样用32位的二进制数来存放(即一个大文件表空间可以拥有232个数据块儿),最后3位的行号占用剩余的16位的二进制数,正好占满80位。

     

     

    大文件相对文件号为0,因为大文件的表的rowid格式中根本就不存在相对文件号的信息,最本质的原因是大文件表空间下永远只能有且仅有1个数据文件。也就没有相对文件号的概念了。同时,对于大文件的表空间,如果数据块大小为32K的话,那

    我们可以在查询列表中,把rowid伪列当做普通的字段来查询。

    我们还可以通过数据库提供给我们的工具包来获取该信息:

    SQL> select rowid,

    2 dbms _rowid.rowid_ _bject(rowid) object id,3 dbms, _kowid.rowid_ relative_ fnorowid) file_ id,

    4 dbms_ rowid.rowid. bock _number(rowid) block_ jd ,5 dbms_ rowidrowid_ row_ number(rowid) num ,

    6 rowidtochar(rowid) from employees where employee_ jd=1007;

    ROWID  OBJECT_ID FILEI _ID BLOCK_ ID  NUM ROWIDTOCHAR(ROWID)

    AAAR5pAAF AAAADPAAA  73321  5  207  : 0 AAAR5pAAFAAAADPAAA

     

     

     

     

    展开全文
  • ROWID

    2018-01-11 12:28:11
    Books → Concepts → Glossary → rowid Books → SQL Language Reference → 3 Pseudocolumns → 3.8 ROWID Pseudocolumn Books → SQL Language Reference → 2 Basic Elements of Oracle SQL → 2.1 Data Typ....

    一、12c 官档

    • Books → Concepts → Glossary → rowid
    • Books → SQL Language Reference → 3 Pseudocolumns → 3.8 ROWID Pseudocolumn
    • Books → SQL Language Reference → 2 Basic Elements of Oracle SQL → 2.1 Data Types → 2.1.2 Rowid Data Types
    • Books → PL/SQL Packages and Types Reference → 139 DBMS_ROWID

    二、分类

    ROWID类型分为两类

    • RESTRICTED—restricted ROWID
    • EXTENDED—extended ROWID:Extended ROWIDs 被用于 8.Xi 或更高版本中

    三、定义

    数据库中行数据的全局唯一地址

    对于数据库中的每一行,ROWID伪列返回行的地址。Oracle数据库rowid值包含定位一行所需的信息:

    • Object No.(32 bit):对象的数据对象号。
    • Block No.(22 bit):数据文件中,行数据驻留的数据块。
    • Row No.(16 bit):数据块中行的位置(第一行为0)
    • File No.(10 bit):行驻留的数据文件(第一个文件是1)。文件编号与表空间相对。

    通常,一个rowid值唯一标识数据库中的行。然而,在不同的数据表,存储在同一个集群的行可以有相同的rowid。
    ROWID伪列的值的数据类型为ROWID或UROWID。查看 Rowid Data Types 和 UROWID Data Type 了解更多内容。

    ROWID值有很多重要的用途:

    • 它们可以最快的定位一条数据
    • 它们可以展示行在表中是如何存储的
    • 它们是行在表中唯一标识。

    你不应该使用ROWID作为表的主键。如果你使用导入导出工具删除并重新插入行,例如,那么其rowid可以改变。如果你删除一行,然后Oracle可能重新分配该rowid给新插入的行。

    虽然你可以使用ROWID伪列在SELECT和WHERE子句中,这些虚拟列值不存储在数据库中。你不能插入、更新或删除ROWID伪列的值。

    实例: 

    SELECT ROWID, last_name
      FROM employees
     WHERE department_id = 20;

    四、相关的数据类

    型数据库中的每一行都有一个地址。下面的部分描述了Oracle数据库中的两种行地址。

    1 ROWID Data Type

    在Oracle数据库中本地组织的表中的行有称为rowids的行地址。您可以通过查询伪列rowid来检查rowid行地址。这个伪列的值是表示每一行地址的字符串。这些字符串有数据类型ROWID。您还可以创建包含有ROWID数据类型的实际列的表和集群。Oracle数据库不能保证这些列的值是有效的rowids。有关ROWID伪列的更多信息,请参考伪列。

    Rowids包含以下信息:

    • 数据文件中包含行的数据块。这个字符串的长度取决于操作系统。
    • 数据块中的行。
    • 包含该行的数据库文件。第一个数据文件的编号为1。这个字符串的长度取决于操作系统。
    • 数据对象号,它是分配给每个数据库段的标识号。您可以从数据字典中检索数据对象数据,查看USER_OBJECTS、DBA_OBJECTS和ALL_OBJECTS。对象共享相同的段(例如,同一簇中的簇表)具有相同的对象编号。

    Rowids被存储为base 64值,该值可以包含字符A-Z、A-Z、0-9和加号(+)和正斜杠(/)。Rowids不能直接使用。您可以使用所提供的包DBMS_ROWID来解释rowid内容。包函数提取并提供了上面列出的四个rowid元素的信息。
    See Also:

    • 《Oracle Database PL/SQL Packages and Types Reference》:有关DBMS_ROWID包可用的函数的信息以及如何使用它们。

    2 UROWID Data Type

    某些表的行有非物理或永久的地址,或者不是由Oracle数据库生成的。例如,索引组织的表的行地址存储在索引叶子中,它可以移动。外部表的Rowids(例如通过网关访问的DB2表)不是标准的Oracle Rowids。

    Oracle使用通用的rowids (urowids)来存储索引组织和外部表的地址。索引组织表有逻辑的urowids,外部表有外部的urowids。这两种类型的urowids都存储在ROWID伪列中(就像heap组织的表的物理ROWID)。

    Oracle根据表的主键创建逻辑rowids。只要主键不变,逻辑rowids就不会改变。索引组织表的ROWID伪列有一个数据类型的UROWID。您可以访问这个伪列,因为您可以使用一个heap组织表的ROWID伪列(使用SELECT…ROWID语句)。如果您想要存储一个索引组织的表的rowids,那么您可以为表一列定义类型为UROWID,并将ROWID伪列的值检索到该列中。

    五、查询(DBMS_ROWID)

    • ROWID_BLOCK_NUMBER:通过rowid提取数据块编号
      • row_id(IN):rowid
      • ts_type_in(IN):表空间类型,BIGFILE:大文件表空间,SMALLFILE:传统表空间
    • ROWID_CREATE:根据给定参数返回一个rowid
      • rowid_type(IN):rowid类型,0:restricted,1:extended
      • object_number(IN):对象id
      • relative_fno(IN):关联文件
      • block_number(IN):数据块id
      • row_number(IN):行号
    • ROWID_INFO:根据rowid返回相关参数
      • rowid_in(IN):rowid
      • rowid_type(OUT):rowid类型
      • object_number(OUT):对象id
      • relative_fno(OUT):相关文件
      • block_number(OUT):数据块id
      • row_number(OUT):行号
      • ts_type_in(IN):表空间类型,BIGFILE:大文件表空间,SMALLFILE:传统表空间
    • ROWID_OBJECT:通过rowid提取对象编号
      • row_id IN:rowid
    • ROWID_RELATIVE_FNO:通过rowid提取相关文件编号
      • row_id(IN):rowid
      • ts_type_in(IN):表空间类型,BIGFILE:大文件表空间,SMALLFILE:传统表空间
    • ROWID_ROW_NUMBER:通过rowid提取行号。
      • row_id(IN):rowid
    • ROWID_TO_ABSOLUTE_FNO:通过rowid和给定表,提取相关文件编号。
      • row_id(IN):rowid
      • schema_name(IN):拥有者
      • object_name(IN):对象名
    • ROWID_TO_EXTENDED:转换一个restricted rowid为一个extended rowid。
      如果原始的rowid存储在列中,转换的 就是internal类型;
      如果原始的rowid是以字符串形式存储的,那转换的就是external类型
      • old_rowid(IN):rowid
      • schema_name(IN):拥有者
      • object_name(IN):对象名
      • conversion_type(IN):转换类型
        0:转换restricted internal rowid为extended格式
        1:转换restricted external rowid为extended格式
    • ROWID_TO_RESTRICTED:转换一个exteneded的rowid为一个restricted的rowid。
      restricted的rowid格式为BBBBBBB.RRRR.FFFFF,
      BBBBBBB 代表block
      RRRR 代表在block中的行号,从0开始
      FFFFF 代表文件号。
      这个包可以使用rowid或者rowid转换类型(ROWID_CONVERT_INTERNAL (0)和ROWID_CONVERT_EXTERNAL (1))
      • old_rowid(IN):rowid
      • conversion_type(IN):转换类型
        0:转换restricted internal rowid为extended格式
        1:转换restricted external rowid为extended格式
    • ROWID_TYPE:通过rowid返回rowid类型:0 是 restricted, 1 是 extended。
      • row_id(IN):rowid
    • ROWID_VERIFY:验证rowid是否有效。
      • rowid_in(IN):rowid
      • schema_name(IN):拥有者
      • object_name(IN):对象名
      • conversion_type(IN):转换类型
        0:转换restricted internal rowid为extended格式
        1:转换restricted external rowid为extended格式

    六:例子

    select rowid,employee_id from employees;
    
    ROWID		   EMPLOYEE_ID
    ------------------ -----------
    AAAFfdAAEAAAADNAAA	   100
    AAAFfdAAEAAAADNAAB	   101
    AAAFfdAAEAAAADNAAC	   102
    AAAFfdAAEAAAADNAAD	   103
    AAAFfdAAEAAAADNAAE	   104
    AAAFfdAAEAAAADNAAF	   105
    AAAFfdAAEAAAADNAAG	   106
    AAAFfdAAEAAAADNAAH	   107
    AAAFfdAAEAAAADNAAI	   108
    AAAFfdAAEAAAADNAAJ	   109
    AAAFfdAAEAAAADNAAK	   110
    
    DECLARE
        v_rowid_type          NUMBER;
        v_OBJECT_NUMBER       NUMBER;
        v_RELATIVE_FNO        NUMBER;
        v_BLOCK_NUMBERE_FNO   NUMBER;
        v_ROW_NUMBER          NUMBER;
    BEGIN
        DBMS_ROWID.rowid_info (
                     rowid_in        => 'AAAFfdAAEAAAADNAAA',
                     rowid_type      => v_rowid_type,
                     object_number   => v_OBJECT_NUMBER,
                     relative_fno    => v_RELATIVE_FNO,
                     block_number    => v_BLOCK_NUMBERE_FNO,
                     ROW_NUMBER      => v_ROW_NUMBER);  --行号从0开始计数
        DBMS_OUTPUT.put_line ('ROWID_TYPE:  ' || TO_CHAR (v_rowid_type));
        DBMS_OUTPUT.put_line ('OBJECT_NUMBER:  ' || TO_CHAR (v_OBJECT_NUMBER));
        DBMS_OUTPUT.put_line ('RELATIVE_FNO:  ' || TO_CHAR (v_RELATIVE_FNO));
        DBMS_OUTPUT.put_line ('BLOCK_NUMBER:  ' || TO_CHAR (v_BLOCK_NUMBERE_FNO));
        DBMS_OUTPUT.put_line ('ROW_NUMBER:  ' || TO_CHAR (v_ROW_NUMBER));
    END;
    /
    ROWID_TYPE:  1
    OBJECT_NUMBER:	22493
    RELATIVE_FNO:  4
    BLOCK_NUMBER:  205
    ROW_NUMBER:  0
    
    select dbms_rowid.rowid_object('AAAFfdAAEAAAADNAAA') object_no,---> 32bit object# 
           dbms_rowid.rowid_relative_fno('AAAFfdAAEAAAADNAAA') file_no,---> 10bit rfile# 
           dbms_rowid.rowid_block_number('AAAFfdAAEAAAADNAAA') block_no,---> 22bit block# 
           dbms_rowid.rowid_row_number('AAAFfdAAEAAAADNAAA') row_no---> 16bit row# 
      from dual;
     OBJECT_NO    FILE_NO	BLOCK_NO     ROW_NO
    ---------- ---------- ---------- ----------
         22493	    4	     205	  0

     

    展开全文
  • RowID

    2010-05-31 15:48:25
    RowID包括物理RowID和逻辑RowID。 物理RowID包括:扩展RowID、受限RowID(Oracle7以前)两种格式。 扩展RowID:OOOOOOFFFBBBBBBRRR,其中 OOOOOO:数据对象编...
    RowID包括物理RowID和逻辑RowID。
     
    物理RowID包括:扩展RowID、受限RowID(Oracle7以前)两种格式。
    扩展RowID:OOOOOOFFFBBBBBBRRR,其中
    OOOOOO:数据对象编号,标识数据库段。
    FFF:数据文件编号。
    BBBBBB:数据块号。
    RRR:行号。
    受限RowID:BBBBBB.RRRR.FFFF,分别为数据块号.行号.数据文件号
     
    逻辑RowID:索引组织表中的数据行没有固定的物理地址,数据行被存储在索引的叶子节点上,可能因为插入操作导致已有数据在块内或块间移动。对于索引组织表Oracle提供逻辑行标识叫逻辑RowID。

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/58174/viewspace-664109/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/58174/viewspace-664109/

    展开全文
  • Rowid

    2009-07-18 09:43:00
    rowid的介绍先对rowid有个感官认识:SQL> select ROWID from test where rownumROWID ------------------ ---------- AAABnlAAFAAAAAPAAA ROWID的格式如下:数据对象编号 文件编号 块编号 行编号OOOOOO F

    rowid的介绍

    先对rowid有个感官认识:

    SQL> select ROWID from test where rownum<2;

    ROWID
    ------------------ ----------
    AAABnlAAFAAAAAPAAA
     
    ROWID的格式如下:

    数据对象编号        文件编号        块编号           行编号
    OOOOOO             FFF                BBBBBB  RRR

    我们可以看出,从上面的rowid可以得知:
    AAABnl 是数据对象编号
    AAF是相关文件编号
    AAAAAP是块编号
    AAA 是行编号

    rowid在查询中,标识记录的唯一性,利用此特性,在Oracle中,可以利用如下语句删除重复的记录

    Delete from test E where test.rowid >(select min(t.rowid) from test X where X.id=E.id  )

    展开全文
  • oracle rowid笔记

    2018-07-02 16:04:25
    ROWID
  • Oracle中的rowid

    2021-02-24 18:50:38
    ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中...
  • 关于rowid

    2019-02-10 10:36:28
    对于表中的每一个数据行来说,rowid是索引用来指向该数据行物理位置的一个信息。 但是informix用来加锁的时候,很多时候都是加在了rowid行,无论是对于数据库,还是对于表,还是数据行。 database rowid的获取: ...
  • mysql rowid

    2019-02-24 19:33:31
    mysql rowid
  • ORACLE ROWID

    2021-07-19 10:18:36
    Oracle通过rowid来唯一标识行,Rowid并不物理存储在数据库中,而是从存储数据的文件和块中推断出来的。 Oracle Database uses arowidto uniquely identify a row.A rowid is not physically stored in the database...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,544
精华内容 31,017
关键字:

rowid